Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Добавление узлов в дерево на C#, Добавление узлов в дерево на C# 
V
    Опции темы
12usver12
Дата 6.6.2007, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 5.1.2007

Репутация: нет
Всего: 1



Везде искала информацию, но именно того, что надо, не нашлось.
Подскажите пожалуйста, вот у меня есть дерево (TreeView): 

- Все задачи
  |
  + Позвонить
  |
  + Встреча
  |
  + Будильник

При добавлении задания (в данном случае узла) вызывается диалоговое окно. Есть комбо-бокс с названиями этих категорий, как в этом дереве. Суть: как, исходя из выбора названия в комбо-боксе, добавить узел в нужную категорию, исходя из выбора?

То есть например:
По умолчанию выделение стоит на корне "Все задачи", вызываем диалоговое окно, выбираем из комбо-бокса категорию "Позвонить" и программа должна поместить узел к узлу, соответствущий выбору. Название узла задается значением, которое вводится в той же форме как описание (в данном примере значение "Вовке")
В результате:

 - Все задачи
   |
   - Позвонить
   |   |
   |    - Вовке  
   |
   + Встреча
   |
   + Будильник


З.Ы. если понадобится, могу привести код
PM MAIL   Вверх
stab
Дата 6.6.2007, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 1
Всего: 48



например так:

Код

TreeNode[] nodes = treeView1.Nodes.Find(comboBox1.Text, false);
if (nodes != null && nodes.Length > 0)
{
    nodes[0].Nodes.Add("new node");
}



--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Naum
Дата 7.6.2007, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 1
Всего: 15



А можно еще в комбо-бокс передавать не просто названия узлов, а ссылки на ноды дерева. Тогда можно 
Код

((TreeNode) combobox1.Value).Add("new node");



--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
12usver12
Дата 7.6.2007, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 5.1.2007

Репутация: нет
Всего: 1



Здравствуй, cully!
Очень интересное решение этого вопроса, но что-то видимо, до меня не дошло
Давай ты посмотришь код, и напишешь, что тут не так. Вроде твой пример должен работать, но - нет.
Заранее спасибо!


Присоединённый файл ( Кол-во скачиваний: 14 )
Присоединённый файл  Organayzer.rar 57,77 Kb
PM MAIL   Вверх
stab
Дата 8.6.2007, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 1
Всего: 48



1. ошибка в обработчике AddJob.button1_Click, надо перенести из button3_Click:

Код

sPath = textBox1.Text;
sText = textBox2.Text;
timerStart = timeStart;
timerEnd = timeEnd;
category = comboBox1.SelectedIndex;


2. ключи для элементов дерева задать равные заголовку (как оно поумолчанию и делается):

Код

root.Nodes.Add("Позвонить", "Позвонить", 0, 0);
root.Nodes.Add("Встреча", "Встреча", 1, 1);
root.Nodes.Add("Будильник", "Будильник", 2, 2);


3. искать элемент и среди подэлемнтов дерева, т.к. они у тебя есть:

Код

TreeNode[] nodes = treeView1.Nodes.Find(addDlg.comboBox1.Text, true);
if (nodes != null && nodes.Length > 0)
{
    nodes[0].Nodes.Add("new node");
}


но это всё так.. косметика. в целом подход не верный. ты хранишь данные в элеметнах управления, а по логике они служат только для представления данных. рекомендую проанализировать предметную область и разбить её на классы. первое что приходит в голову, сделать классы: JobManager (Organizer), Job, JobCategory, .. это позволит отделить интерфейс пользователя от логики\данных + внесёт ясность в код.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
12usver12
Дата 8.6.2007, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 5.1.2007

Репутация: нет
Всего: 1



Ура! Все чудесно работает smile  Спасибо!
Теперь ясно, что главная ошибка у меня была в неправильном присвоении ключа для элементов, а вот с кнопкой - вообще несуразность вышла smile Вначале прочитала твою рекомендацию по поводу AddJob.button1_Click и первая мысль: "Не может такого быть! Это ж элементарные вещи!" А затем, глянув в код, удивлению не было предела. В два часа ночи писала, называется...

Попутно возник еще один вопрос. По поводу сохранения и загрузки содержимого ListView.
Код

private void saveListJobs(object sender, EventArgs e)
{
    FileStream fs = new FileStream(FILE_NAME, FileMode.OpenOrCreate, FileAccess.Write);
    StreamWriter sr = new StreamWriter(fs);


    ListView.ListViewItemCollection col = new ListView.ListViewItemCollection(listView1);
    foreach (ListViewItem lv in col)
    {
        for (int i = 0; i < lv.SubItems.Count; i++)
        {
            sr.Write(lv.SubItems[i].Text + "^");
        }
        sr.WriteLine();

    }

    sr.Close(); 
    fs.Close();
} 

где 
Код

private string FILE_NAME = Application.StartupPath + "\\Data.txt";


все содержимое чудесно записывается, но вот как потом считать все содержимое сохранного файла?
Как узнать, что строка закончилась, и нужно считывать данные уже для следущего поля?

Код

// считывается только первая строчка
private void loadListJobs(object sender, EventArgs e)
{
    listView1.Items.Clear();
    try
    {
        FileStream fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read);


        byte[] b = new byte[170];
        System.Text.UTF8Encoding temp = new UTF8Encoding(true);

        fs.Read(b, 0, b.Length);
        fs.Close();
        string str = temp.GetString(b);

        char[] seps = { '^', '\0' };
        string[] parts = str.Split('^');

        ListViewItem.ListViewSubItem[] subItem;
        ListViewItem item = new ListViewItem(parts[0].ToString());
        subItem = new ListViewItem.ListViewSubItem[]
        {
            new ListViewItem.ListViewSubItem(item,parts[1].ToString()),
            new ListViewItem.ListViewSubItem(item,parts[2].ToString()),
            new ListViewItem.ListViewSubItem(item,parts[3].ToString()),
            new ListViewItem.ListViewSubItem(item,parts[4].ToString()),
            new ListViewItem.ListViewSubItem(item,parts[5].ToString())
        };
        item.SubItems.AddRange(subItem);
        listView1.Items.Add(item);
    }
    catch
    {
    }
}


Ясное дело, что str должна еще проверятся на окончание строки ('\0'), то есть ищем до тех пор и считываем информацию, пока не будет считан последний перевод строки. Но вот как?....
PM MAIL   Вверх
12usver12
Дата 9.6.2007, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 5.1.2007

Репутация: нет
Всего: 1



Все, кажется, разобралась smile

Через сериализацию оказалось все намного проще и эффектнее
Вот новый вариант и все чудесно работает, так, как и хотелось smile 

Код

private void saveListJobs(object sender, EventArgs e)
{
    BinaryFormatter bf = new BinaryFormatter();
    //Serialize:


    FileStream fs = new FileStream(Application.StartupPath + "\\Data.txt", System.IO.FileMode.Create);
    bf.Serialize(fs, new ArrayList(listView1.Items));
}

private void loadListJobs(object sender, EventArgs e)
{
    listView1.Items.Clear();
    try
    {
        BinaryFormatter bf = new BinaryFormatter();
        //Deserialize:

        FileStream fs = new FileStream(Application.StartupPath + "\\Data.txt", System.IO.FileMode.Open);
        ArrayList arr = (ArrayList)bf.Deserialize(fs);
        listView1.Items.AddRange((ListViewItem[])arr.ToArray(arr[0].GetType()));
    }
    catch
    {
    }





PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0449 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.