Имеется две формы: главная, подчинённая.
Сценарий
Запускаю отладку;
Создаю таблицу public DataTable dt_1
Заполняю таблицу через dataGridView1
Сохраняю таблицу в Settings.settings в переменную public global::System.Data.DataTable sett_frm_1_dt_1
Останавливаю отладку;
Выполняю сборку проекта;
Запускаю файл rsh.exe (c:...
sh\bin\Debug);
Проблема: После запуска rsh.exe переменная public global::System.Data.DataTable sett_frm_1_dt_1 пуста.
Код главной формы
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} // Form1()
// ФОРМЫ
Form2 frm_2; // Form2
public DataTable dt_1;
private void button1_Click(object sender, EventArgs e)
{
// Form2
frm_2 = new Form2();
frm_2.Owner = this;
frm_2.Show();/* или F2.ShowDialog();*/
}
}
Код подчинённой формы
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
} // public Form2()
Form1 frm_1;
private void Form2_Load(object sender, EventArgs e)
{
frm_1 = this.Owner as Form1;
fnk_crt_dt_1();
}
private void Form2_Show(object sender, EventArgs e)
{
#region *** СОБЫТИЯ. f_prt_1.dt_030_html ***
// Подписываемся на событие вставки новой строки.//
frm_1.dt_1.TableNewRow += DataTableNewRow; //
// СОБЫТИЕ. Происходит после успешного изменения DataRow
frm_1.dt_1.RowChanged += new DataRowChangeEventHandler(Row_Changed); //
// СОБЫТИЕ. Происходит после удаления строки в таблице.
frm_1.dt_1.RowDeleted += new DataRowChangeEventHandler(Row_Deleted); //
#endregion *** СОБЫТИЯ. f_prt_1.dt_030_html ***. КОНЕЦ ХХХ
// извлечь таблицу из Settings
// fnk_frm_1_dt_1_fr_set();
} // Form2_Show
// СОБЫТИЕ. ПРИСВОИТЬ ID //
private void DataTableNewRow(object sender, DataTableNewRowEventArgs dataTableNewRowEventArgs)
{
try
{
int max = (int)frm_1.dt_1.Compute("Max(ID)", "");
dataTableNewRowEventArgs.Row["ID"] = max + 1; // dataTableNewRowEventArgs - вызывает событие TableNewRow.
}
catch
{
}
}
// СОБЫТИЕ. Происходит после успешного изменения DataRow
private void Row_Changed(object sender, DataRowChangeEventArgs e) //
{
Properties.Settings.Default.sett_frm_1_dt_1 = frm_1.dt_1;
Properties.Settings.Default.Save();
}
// СОБЫТИЕ. Происходит после удаления строки в таблице.
private void Row_Deleted(object sender, DataRowChangeEventArgs e)
{
Properties.Settings.Default.sett_frm_1_dt_1 = frm_1.dt_1;
Properties.Settings.Default.Save();
}
// *** *** *** ***
// ФУНКЦИИ
// *** *** *** ***
// создаём таблицу
public void fnk_crt_dt_1()
{
frm_1.dt_1 = new DataTable();
// BS_029_html = new BindingSource();
frm_1.dt_1.TableName = "frm_1_dt_1_Name";
// ДОБАВЛЕНИЕ ПОЛЕЙ
frm_1.dt_1.Columns.Add("ID", typeof(Int32));
frm_1.dt_1.Columns.Add("pl_1", typeof(String)); // Имя html сценария
frm_1.dt_1.Columns.Add("pl_2", typeof(String));
frm_1.dt_1.Columns.Add("pl_3", typeof(String));
// добавляем первый 'ID' = 1
DataRow newRow = frm_1.dt_1.NewRow();
newRow["ID"] = 1;
frm_1.dt_1.Rows.Add(newRow);
dataGridView1.DataSource = frm_1.dt_1;
}
public void fnk_frm_1_dt_1_in_set() // сохранить
{
Properties.Settings.Default.sett_frm_1_dt_1 = frm_1.dt_1;
Properties.Settings.Default.Save();
}
public void fnk_frm_1_dt_1_fr_set() // извлечь
{
frm_1.dt_1 = Properties.Settings.Default.sett_frm_1_dt_1;
dataGridView1.DataSource = frm_1.dt_1;
}
// *** *** *** ***
// КНОПКИ
// *** *** *** ***
// создаём таблицу
private void button1_Click(object sender, EventArgs e)
{
fnk_crt_dt_1();
}
// сохранить таблицу
private void button2_Click(object sender, EventArgs e)
{
fnk_frm_1_dt_1_in_set();
}
// извлечь таблицу
private void button3_Click(object sender, EventArgs e)
{
fnk_frm_1_dt_1_fr_set();
}
} // Form2 : Form
ВОПРОС
Как сделать чтобы данные сохранённые при отладке в переменнуюpublic global::System.Data.DataTable sett_frm_1_dt_1 после сборки отображались в rsh.exe файле?
Также как сделать чтобы данные отображались, если файл rsh.exe перемещён в другую папку?
Скрин
Ответ
Насколько я понял, если два раза запустить программу из Visual Studio то таблица сохраняется и проблема состоит именно в том, что настройки не сохраняются при разном способе запуска (из среды и вручную).
Проблема
В папке Debug кроме rsh.exe есть еще файл rsh.vshost.exe. При откладке из Visual Studio запускается rsh.vshost.exe.
Пользовательские настройки сохраняются в расположении, которое зависит от имени файла. Поэтому для rsh.exe и rsh.vshost.exe будут разные настройки (что логично для двух разных приложений).
Сохранение настроек
Путь, в котором сохраняются пользовательские настройки, для автономного приложения выглядит примерно так:
%LOCALAPPDATA%\(PUBLISHER)\(APP_NAME).exe_(StrongName|Url)_(HASH)\(APP_VERSION)\
, по порядку:
PUBLISHER — организация разработчка, прописывается в настройках проекта;
APP_NAME — имя сборки (в данном случае исполняемого файла);
HASH — хэш строгого имени либо, если его нет, пути;
APP_VERSION — версия, так же прописывается в настройках проекта.
В Вашем случае проблема в том, что при отсутствии строгого имени у сборки хэш рассчитывается по пути к файлу, которое в данном случае будет отличаться.
Подробнее про сохранение пользовательских настроек можно почитать здесь:
Client Settings FAQ — MSDN Blogs.
When using a Settings.settings file in .NET, where is the config actually stored?
Решение:
Как вариант, можно подписать приложение и установить строгое имя. Это можно сделать в Visual Studio (смотрите руководство). В этом случае настройки приложения не будут зависеть от расположения файла и rsh.exe будет загружать сохраненные настройки после перемещения в другую папку.
UPDATE: Как выяснилось, APP_NAME это все-таки имя файла, а не имя сборки, соответственно, для rsh.vshost.exe настройки будут все-таки разными.
Если очень нужно (интересно, зачем?) чтобы во время отладки использовались те же настройки, то можно отключить создание отдельного исполняемого файла rsh.vshost.exe.
В настройках проекта во вкладке «Debug» (скорее всего «Отладка», нет русифицированной среды под рукой) снимите флажок «Enable Visual Studio hosting process» («Разрешить главный процесс Visual Studio»). После этого Visual Studio и во время отладки будет запускать rsh.exe напрямую.
Отключение приведет к тому, что отдельные функции во время отладки не будут доступны (подробнее в руководстве на MSDN). Это не должно быть проблемой, можно устанавливать флажок для разработки/отладки и снимать его когда нужна синхронизация настроек.
P.S. Не мог воспроизвести проблему с vshost.exe т.к. APP_NAME при сохранении настроек обрезается до первых 26 символов. Т.о. если дать приложению длинное название, например, rsh_WithExtremelyLongName, то путь к настройкам для .exe и .vshost.exe совпадет.
Комментариев нет:
Отправить комментарий