private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e)
{
TreeNode sel = treeView1.SelectedNode;
if (sel != null)
sel.Tag = textBox1.Text;
}
Treeview и С#
Не могу разобраться с treeview.
Имеется пояснительная картинка.
http://s53.radikal.ru/i139/1003/9e/4a26f9250b93.jpg
есть treeview и richbox. Я создаю дерево и ввожу текст в ричбокс и он сохраняется по деревьям как показано на рисунках стрелочками.
код этих дейтсвий
Код:
Код:
private void treeView1_AfterSelect_1(object sender, TreeViewEventArgs e)
{
textBox1.Text = (String)e.Node.Tag;
}
{
textBox1.Text = (String)e.Node.Tag;
}
потом другой кнопочкой я вставляю картинку в richbox.
далее сохраняю все с помощью сериализации...
потом открываю а картинки нет...умныr люди подсказали что надо как-то давать ссылку на картинку при создание XML файла...вот я и хочу спросить как это сделать чтобы картинка моя сохранялась и открывалась вместе с текстом ?
2) Где происходит привязка изображения?
Вы там уже пришли к выводу юзать базы данных. Конечно, это можно, но вы сами пишите, что времени в обрез, и вы вряд ли успеете. Потому предлагаю простой выход.
Картинка, вставленная в 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();
}
[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.
Код:
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
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;
}
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);
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);
всё равно огромное спасибо, что уделил мне время..
неужели придётся возиться с БД ?
Цитата: 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;
}
{
if (treeView1.SelectedNode != null)
treeView1.SelectedNode.Tag = richTextBox1.Rtf;
}
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
richTextBox1.Rtf = (string)e.Node.Tag;
}
Цитата: Sp1ker
неужели придётся возиться с БД ?
А какой предполагается размер сохраняемых данных? Я в своём примере пихаю всё в один файл. И если картинок будет очень много (сотни или даже тысячи), и они большого размера, то размер итогового файла может составить сотни мегабайт, а то и гигабайты. Что не есть хорошо. В таком случае следует искать другой подход.
вот ссылка на мой проект
проект
это пояснительная картинка.
1. Сюда ввожу я имя нода которое потом добавляется в treeview.
2. Нажимаю на + это добавляет мой нод в treeview. - соответственно удаляет выделенный нод.
3. когда я на создаю нодов,то выбираю мне нужный и ввожу туда текст.
4. Потом вставляю картинку в нужный мне нод.
5. Нажимаю сохранить проект.
6. Закрываю программу.
7. Открываю и должно появиться ранее сделанное мной дерево с текстом и картинками. но появляется только текст. я сделал как вы подложили но выдаёт ошибку. Свой код я пометил в проекте комментариями. Если не трудна посмотри что не так.
В заранее ОГРОМНОЕ СПАСИБО!!!!
Цитата:
А какой предполагается размер сохраняемых данных? Я в своём примере пихаю всё в один файл. И если картинок будет очень много (сотни или даже тысячи), и они большого размера, то размер итогового файла может составить сотни мегабайт, а то и гигабайты. Что не есть хорошо. В таком случае следует искать другой подход.
нет их будет не больше 10
Если метод 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);
}
{
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);
}
Огромное спасибо, что помогал. Выручил меня очень сильно. Говорю как есть. Без всяких пантов и всякой фигни. Успехов тебе и здоровья.
С уважением Сашка Штурмовик