Два вопроса:
******
1)Полуметодологический:
******
В datagridview хочу сделать на разные колонки вызов
OpenFileDialog И SaveFileDialog соответственно.
Но дабы не писать код с повторением:
if (this.dataGridView1.CurrentCell.ColumnIndex == 0)
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.Filter = "ISIS DB files (*.db)|*.db";
dlg.InitialDirectory = Application.StartupPath;
if (dlg.ShowDialog(this) != DialogResult.OK)
return;
this.dataGridView1.CurrentCell.Value = dlg.FileName;
}
else
{
SaveFileDialog dlg = new SaveFileDialog();
dlg.Filter = "ISIS DB files (*.db)|*.db";
dlg.InitialDirectory = Application.StartupPath;
if (dlg.ShowDialog(this) != DialogResult.OK)
return;
this.dataGridView1.CurrentCell.Value = dlg.FileName;
}
в котором два куска практически одинаковы, решил сделать так:
object dlg;
if (this.dataGridView1.CurrentCell.ColumnIndex == 0)
{
dlg = new OpenFileDialog();
}
else
{
dlg = new SaveFileDialog();
}
dlg.Filter = "ISIS DB files (*.db)|*.db";
dlg.InitialDirectory = Application.StartupPath;
if (dlg.ShowDialog(this) != DialogResult.OK)
return;
this.dataGridView1.CurrentCell.Value = dlg.FileName;
Но вот незадача, ругается компилятор, говоря, что
"Error 1 'object' does not contain a definition for 'Filter'"
Ну и так далее по все оставшимся свойствам.
Не вполне понимаю причину этого. Смотрел в дебаге, после выхода из if объект
становится того типа, который ему присвоен в условии. Соответвтвенно,
определяемые свойства у него в наличии. Вроде бы компилятор должен это видеть.
Или ему по барабану и он считает что при выходе за пределы области видимости, в которой объект типизирован,
таковой снова становится "девственно чистым" с точке зрения типизации?
Возможно ли заставить последний код выполнятся?
Нужнго где-то тип, что ли, привести?
*******
2)Практический
*******
Решил в Datagridview при DoubleClick На ячейку вызвапать OpenFileDialog, определить Путь к файлу и прописать его в ячейку.
Сказоно - сделано
private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.Filter = "ISIS DB files (*.db)|*.db";
dlg.InitialDirectory = Application.StartupPath;
if (dlg.ShowDialog(this) != DialogResult.OK)
return;
this.dataGridView1.CurrentCell.Value = dlg.FileName;
}
испытваю - все ок, тыкаю, появлеется opebnfiledialog, указываю файл,
тыкаю ok - и Cell остается пустой. Надпись в нем появляется только при выходе ячейки из фокуса
(в смысле она становится не CurrentCell)
Пытаюсь решить проблему добавлением функции:
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
this.dataGridView1.Update();
}
Не лечит.
Второй вариант:
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (dataGridView1.IsCurrentCellDirty)
{
dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
}
Разнообразные вариации на эту же тему, с функцией dataGridView1_CurrentCellDirtyStateChanged не помогают
тоже.
Возможно ли сделать так, чтобы путь прописывлся в ячейку сразу после того, как он определен,
и до того, как ячейка вышла из фокуса (стала Not current)?