Восстановление всех данных, сохраненных в пользовательском расширении файла, содержащем некоторые данные мастеров и некоторые древовидные узлы с использованием C#
Недавно я работал над приложением windows, которое содержит некоторые узлы дерева, генерируемые мастерами, и мастера содержат некоторые данные, связанные с узлами.Каждое имя treenode переименовывается именем мастера, образуя таким образом иерархию узлов.
Вот узлы, которые динамически генерируются мастерами на передней панели:NODE. png - Google Диск[^]
Эти узлы также содержат данные, которые сбрасываются в базу данных, и при щелчке правой кнопкой мыши на любом из узлов извлекаются их свойства, подобные этому:WIZARD. png - Google Диск[^].
Я могу сохранить его, используя свое собственное расширение файла, но когда я пытаюсь открыть этот пользовательский сохраненный файл расширения, я могу только получить узел и не могу просмотреть их сохраненные данные или свойства узла[например, щелкнуть правой кнопкой мыши узел и просмотреть сохраненные данные из свойств с помощью полосы контекстного меню].Контекстное меню menustrip не открывается для открытых файлов.
Может ли кто-нибудь помочь мне предложить что-то, что могло бы принести мне все данные, хранящиеся на узлах, которые были сброшены в базу данных.
Ниже приведен код, который я использовал для сохранения файла:
SaveFileDialog SaveFileDialog1 = new SaveFileDialog(); if (SaveFileDialog1.CheckPathExists == false) { SaveFileDialog saveFileDialog1 = new SaveFileDialog(); saveFileDialog1.InitialDirectory = @"C:\"; saveFileDialog1.Title = "Save Vaar Files"; // saveFileDialog1.CheckFileExists = true; saveFileDialog1.CheckPathExists = true; saveFileDialog1.DefaultExt = "vaar"; saveFileDialog1.Filter = "vaar file (*.vaar)|*.vaar*"; saveFileDialog1.FilterIndex = 2; saveFileDialog1.AddExtension = true; // saveFileDialog1.RestoreDirectory = true; if (saveFileDialog1.ShowDialog() == DialogResult.OK) { pathh = saveFileDialog1.FileName.ToString(); saveTree(treeView1, pathh); } } else { saveTree(treeView1, pathh); }
А ниже приведен код для открытия сохраненного файла:
treeView1.Nodes.Clear(); OpenFileDialog openFileDialog1 = new OpenFileDialog(); openFileDialog1.InitialDirectory = @"C:\"; openFileDialog1.Title = "Browse Text Files"; openFileDialog1.CheckFileExists = true; openFileDialog1.CheckPathExists = true; openFileDialog1.DefaultExt = "txt"; openFileDialog1.Filter = "vaar file (*.vaar)|*.vaar|All files (*.*)|*.*"; openFileDialog1.FilterIndex = 2; openFileDialog1.RestoreDirectory = true; openFileDialog1.ReadOnlyChecked = true; openFileDialog1.ShowReadOnly = true; string pathh = ""; if (openFileDialog1.ShowDialog() == DialogResult.OK) { pathh = openFileDialog1.FileName.ToString(); loadTree(treeView1, openFileDialog1.FileName.ToString()); }
После открытия сохраненного файла я не могу открыть contextmenustrip, щелкнув правой кнопкой мыши узлы точно так же, как я мог щелкнуть правой кнопкой мыши на узлах при их создании и просмотре их свойств...Любая помощь будет очень признательна..:)
Что я уже пробовал:
Я пробовал искать эту проблему повсюду, а также публиковал ее на различных форумах, но не мог найти никакой помощи
Richard MacCutchan
Все, что вы показали, - это код для SaveFileDialog
и OpenFileDialog
, ни один из которых не имеет ничего общего с записью или чтением данных в файл.
Member 12856607
Вот два метода, которые сохраняют и загружают файлы:
Спасительного дерева:
saveTree(дерево TreeView, строковое имя файла)
{
ArrayList al = новый ArrayList();
foreach (TreeNode tn в дереве.Узлы)
{
// Сохраните каждый корневой узел в TreeView ...
Аль.Добавить(Теннесси);
}
// создавать файлы
Потоковый файл = Файл.Open (filename, FileMode.Создавать);
BinaryFormatter bf = новый BinaryFormatter();
пробовать
{
// Сериализация Массивов
БФ.Сериализовать(файл, Аль);
}
поймать (системы.Во время выполнения.Сериализация.Исключение serializationexception е)
{
Ящик для сообщений.Show ("Serialization failed : {0}", e.Message);
return -1; / / ошибка
}
// Закройте файл
файл.Закрывать();
возвращает 0;
}
Загрузка дерева:
loadTree (дерево TreeView, строковое имя файла)
{
если (файл.Существует(имя файла))
{
// открытый файл
Потоковый файл = Файл.Открыть(именем, содержит filemode.Открыть);
BinaryFormatter bf = новый BinaryFormatter();
// Объект var. в этом.
object obj = null;
пробовать
{
// Отключить данные из файла
obj = bf. Deserialize(файл);
}
поймать (системы.Во время выполнения.Сериализация.Исключение serializationexception е)
{
Ящик для сообщений.Show ("de-Serialization failed : {0}", e.Message);
возврат -1;
}
// Закройте файл
файл.Закрывать();
Создать новый массив
ArrayList nodeList = obj as ArrayList;
// загрузить корневые узлы
foreach (узел TreeNode в списке узлов)
{
дерево.Узлы.Добавить (узел);
}
возвращает 0;
}
else return -2; / / файл не существует
}
Richard MacCutchan
Трудно понять, что происходит не так, но мне интересно, не потому ли это, что вы создаете ArrayList из дерева. Почему бы не сериализовать древовидные узлы напрямую?
Member 12856607
как я могу сериализовать treenode напрямую?
Richard MacCutchan
Посмотрите на метод сериализации в документации.