Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Treeview и С#

57K
07 марта 2010 года
Sp1ker
4 / / 07.03.2010
Пишу диплом на тему автоматизированная программа обучения.
Не могу разобраться с treeview.
Имеется пояснительная картинка.
http://s53.radikal.ru/i139/1003/9e/4a26f9250b93.jpg
есть treeview и richbox. Я создаю дерево и ввожу текст в ричбокс и он сохраняется по деревьям как показано на рисунках стрелочками.
код этих дейтсвий

 
Код:
private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e)
        {
             TreeNode sel = treeView1.SelectedNode;
             if (sel != null)
                    sel.Tag = textBox1.Text;
        }




 
Код:
private void treeView1_AfterSelect_1(object sender, TreeViewEventArgs e)
        {
            textBox1.Text = (String)e.Node.Tag;

        }


потом другой кнопочкой я вставляю картинку в richbox.

далее сохраняю все с помощью сериализации...


потом открываю а картинки нет...умныr люди подсказали что надо как-то давать ссылку на картинку при создание XML файла...вот я и хочу спросить как это сделать чтобы картинка моя сохранялась и открывалась вместе с текстом ?
5
08 марта 2010 года
hardcase
4.5K / / 09.08.2005
1) Как сохраняете? В дотнете миниум 3 встроенных форматтера.
2) Где происходит привязка изображения?
297
08 марта 2010 года
koodeer
1.2K / / 02.05.2009
По адресу, видимому на скриншоте, глянул вашу тему на форуме исходники.ру.
Вы там уже пришли к выводу юзать базы данных. Конечно, это можно, но вы сами пишите, что времени в обрез, и вы вряд ли успеете. Потому предлагаю простой выход.

Картинка, вставленная в RichTextBox прекрасно сохраняется в файл и считывается оттуда, достаточно работать со свойством Rtf, а не Text.

Код:
[color=Teal]Stream[/color] stream;
[color=Teal]BinaryFormatter[/color] bf;

[color=Blue]void[/color] SaveTreeNodes([color=Teal]TreeNodeCollection[/color] tnc)
{
    bf.Serialize(stream, tnc.Count);
    [color=Blue]foreach[/color] ([color=Teal]TreeNode[/color] node [color=Blue]in[/color] tnc)
    {
        bf.Serialize(stream, node.Text);
        bf.Serialize(stream, node.Tag);
        SaveTreeNodes(node.Nodes);
    }
}

[color=Blue]private[/color] [color=Blue]void[/color] buttonSave_Click([color=Blue]object[/color] sender, [color=Teal]EventArgs[/color] e)
{
    stream = [color=Blue]new[/color] [color=Teal]FileStream[/color]([color=Maroon]"test.dat"[/color], [color=Teal]FileMode[/color].Create);
    bf = [color=Blue]new[/color] [color=Teal]BinaryFormatter[/color]();
    SaveTreeNodes(treeView1.Nodes);
    stream.Close();
}

[color=Blue]void[/color] LoadTreeNodes([color=Teal]TreeNodeCollection[/color] tnc)
{
    [color=Blue]int[/color] count = ([color=Blue]int[/color])bf.Deserialize(stream);
    [color=Blue]for[/color] ([color=Blue]int[/color] i = 0; i < count; i++)
    {
        [color=Teal]TreeNode[/color] node = [color=Blue]new[/color] [color=Teal]TreeNode[/color](([color=Blue]string[/color])bf.Deserialize(stream));
        node.Tag = bf.Deserialize(stream);
        tnc.Add(node);
        LoadTreeNodes(node.Nodes);
    }
}

[color=Blue]private[/color] [color=Blue]void[/color] buttonLoad_Click([color=Blue]object[/color] sender, [color=Teal]EventArgs[/color] e)
{
    treeView1.Nodes.Clear();
    stream = [color=Blue]new[/color] [color=Teal]FileStream[/color]([color=Maroon]"test.dat"[/color], [color=Teal]FileMode[/color].Open);
    bf = [color=Blue]new[/color] [color=Teal]BinaryFormatter[/color]();
    LoadTreeNodes(treeView1.Nodes);
    stream.Close();
}

Данный код сохраняет структуру дерева вместе с содержимым из RichTextBox.
Обработку возможных исключений делайте сами. За корректностью и наличием данных (того, что присваивается свойствам Tag) тоже необходимо следить.

При желании, можете сделать сериализацию в XML.

PS: раз уж вы пишите программу обучения, то будьте добры не допускать ошибок наподобие: матор, типо. // Grammar Nazi.
57K
08 марта 2010 года
Sp1ker
4 / / 07.03.2010
чтоб код работал надо подключить

 
Код:
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;



но беда...всё равно картинка не сохраняется...



картинку вставляю в ричбокс стандартным примером.

Код:
OpenFileDialog openFileDialog1 = new OpenFileDialog();
            openFileDialog1.DefaultExt = "*.*";
            openFileDialog1.Filter = "All Files|*.*";

            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK &&
            openFileDialog1.FileName.Length > 0)
            {
                // Open an bitmap from file and copy it to the clipboard.
                Bitmap myBitmap = new Bitmap(openFileDialog1.FileName);
                // Copy the bitmap to the clipboard.
                Clipboard.SetDataObject(myBitmap);

                // Get the format for the object type.
                DataFormats.Format myFormat = DataFormats.GetFormat(DataFormats.Bitmap);

                // After verifying that the data can be pasted, paste it.
                if (richTextBox1.CanPaste(myFormat))
                {
                    richTextBox1.Paste(myFormat);
                    return;
                }


нашёл другой способ вставки картинки...думал в нём дело...нет!!!Всё равно не сохраняет...

Код:
object orgdata = Clipboard.GetDataObject();
            openFileDialog1.Filter = "All files |*.jpg";
            openFileDialog1.FileName = "";
            openFileDialog1.Multiselect = false;
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                Image img = Image.FromFile(openFileDialog1.FileName);
                Clipboard.SetImage(img);
                richTextBox1.Paste();
            }
            Clipboard.SetDataObject(orgdata);


всё равно огромное спасибо, что уделил мне время..

неужели придётся возиться с БД ?
297
09 марта 2010 года
koodeer
1.2K / / 02.05.2009
Цитата: Sp1ker
но беда...всё равно картинка не сохраняется...



Проблема у вас не со вставкой картинки. Очевидно, вы до сих пор оставили прежний код (ваш первый пост), в котором юзается TextBox.
Ещё раз повторяю: нужно работать со свойством Rtf ричбокса. Что-то вроде:

 
Код:
private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e)
{
    if (treeView1.SelectedNode != null)
        treeView1.SelectedNode.Tag = richTextBox1.Rtf;
}

private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
    richTextBox1.Rtf = (string)e.Node.Tag;
}

Цитата: Sp1ker
неужели придётся возиться с БД ?


А какой предполагается размер сохраняемых данных? Я в своём примере пихаю всё в один файл. И если картинок будет очень много (сотни или даже тысячи), и они большого размера, то размер итогового файла может составить сотни мегабайт, а то и гигабайты. Что не есть хорошо. В таком случае следует искать другой подход.

57K
09 марта 2010 года
Sp1ker
4 / / 07.03.2010
вот именно я всё изменил. и тогда прпроект зависает.

вот ссылка на мой проект
проект

это пояснительная картинка.

1. Сюда ввожу я имя нода которое потом добавляется в treeview.
2. Нажимаю на + это добавляет мой нод в treeview. - соответственно удаляет выделенный нод.
3. когда я на создаю нодов,то выбираю мне нужный и ввожу туда текст.
4. Потом вставляю картинку в нужный мне нод.
5. Нажимаю сохранить проект.
6. Закрываю программу.
7. Открываю и должно появиться ранее сделанное мной дерево с текстом и картинками. но появляется только текст. я сделал как вы подложили но выдаёт ошибку. Свой код я пометил в проекте комментариями. Если не трудна посмотри что не так.
В заранее ОГРОМНОЕ СПАСИБО!!!!

Цитата:
А какой предполагается размер сохраняемых данных? Я в своём примере пихаю всё в один файл. И если картинок будет очень много (сотни или даже тысячи), и они большого размера, то размер итогового файла может составить сотни мегабайт, а то и гигабайты. Что не есть хорошо. В таком случае следует искать другой подход.



нет их будет не больше 10

57K
09 марта 2010 года
Sp1ker
4 / / 07.03.2010
Ошибка возникает потому, что при сериализации сначала сохраняешь Tag, а потом Text. А при чтении - сначала читаешь Text, а потом - Tag.
Если метод SaveTreeNodes немного изменить, все работает нормально, без ошибок:

 
Код:
void SaveTreeNodes(TreeNodeCollection tnc)
{
    bf.Serialize(stream, tnc.Count);
    foreach (TreeNode node in tnc)
    {
        bf.Serialize(stream, node.Text);
        bf.Serialize(stream, node.Tag == null ? "" : node.Tag);
       
        SaveTreeNodes(node.Nodes);
   }


Огромное спасибо, что помогал. Выручил меня очень сильно. Говорю как есть. Без всяких пантов и всякой фигни. Успехов тебе и здоровья.
С уважением Сашка Штурмовик
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог