Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > удаление из TreeView


Автор: GGuz 11.9.2008, 10:44
Подскажите как при удалении узла из TreeView удалить его из БД. Т.е. нужно выяснить к какой записи в Бд относится выделенный узел.

БД: Tree(Id, Name, ParentId)

вот код запихивания из БД в TreeView:

       
Код

private void MainForm_Load(object sender, EventArgs e)
        {
            SqlDataAdapter DataAdapter = new SqlDataAdapter(comm, conn);
            DataSet myDataSet = new DataSet();
            DataAdapter.Fill(myDataSet, "Tree");          


            FillTreeView(tvwMain, myDataSet);

        }    

        private void FillTreeView(TreeView treeView, DataSet ds)
        {
            treeView.Nodes.Clear();            
            DataRow[] rows = ds.Tables["Tree"].Select("ParentId = 0");
            foreach (DataRow row in rows)
                {
                    TreeNode newNode = new TreeNode(row["Name"].ToString());
                    newNode.Tag = row["Id"];
                    treeView.Nodes.Add(newNode);
                    FillNode(newNode, ds);
                    
                }
          }        

         private void FillNode(TreeNode parentNode, DataSet ds)
         {                
             DataRow[] rows = ds.Tables["Tree"].Select(string.Format("ParentId = {0}", parentNode.Tag));
             foreach (DataRow row in rows)
                {
                    TreeNode newNode = new TreeNode(row["Name"].ToString());
                    newNode.Tag = row["Id"];
                    parentNode.Nodes.Add(newNode);                    
                    FillNode(newNode, ds);                    
                }
         }     


Получается что после запихивания я теряю контроль над узлами(не знаю чему они соответствуют в БД). Можно было б по "Name" выяснять(сравнивать с данными из БД), но Name могут совпадать. Если кто знает, подскажите. Заранее пасиб.

Автор: Dogo 12.9.2008, 08:45
В методе FillNode помещайте в newNode.Tag не row["Id"], а row.
После манипуляции с узлом вызывайте соответствующий метод DataRow

Автор: GGuz 14.9.2008, 12:46
Хм.. А почему не оставить так? Т.е. я проверяю таг выделенного нода(т.е. ID) и проверяю(сравниваю) его в БД. Я не совсем верно задал вопрос. Вариант проверки есть(тока что описал), но мне хотелось бы узнать может он не совсем практичный, возможно имеются другие, более правильные варианты. Dogo чем этот вариант лучше моего? Сори за неправильно поставленный вопрос. smile

Автор: Dogo 14.9.2008, 13:01
Цитата(GGuz @  14.9.2008,  13:46 Найти цитируемый пост)
Dogo чем этот вариант лучше моего?

Тем что в моем случае Tag уже хранит ссылку на интересующий row, а в вашем для того чтобы осуществить действия с row необходимо его прежде по id выбрать из DataTable

Цитата(GGuz @  14.9.2008,  13:46 Найти цитируемый пост)
я проверяю таг выделенного нода(т.е. ID) и проверяю(сравниваю) его в БД

А для чего это делать? 
У вас в myDataSet есть вся необходимая информация, остается только внести в нее изменения, а после получить DataSet всех изменений и при помощи метода myDataSet.Update(DataSet с изменениями) обновить информацию в БД.

Автор: GGuz 14.9.2008, 13:36
В принципе да, избавляет от некоторого лишнего кода smile  Пасиб.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)