Тема “Два вопроса”

 
ФорумПравилаПоиск Вы не вошли | ВойтиРегистрация
Показаны элементы c 1 по 3 из 3
Бронштейн (постов: 33) (4 октября 2007 г., 18:52)
Два вопроса:
******
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)?
Patrol (постов: 511) (5 октября 2007 г., 1:46)
Про номер один - тут все понятно. Ты объявил переменную как object, соответственно компилятор тебе позволит обращаться только к тем членам и методам объекта, которые присущи классу object. Просто потому, что он (компилятор) обязан гарантироать корректность вызова.
Область видимости тут ни при чем: копмилятор нормально видит переменную, но видит ее как object. Для того, чтобы вызвать метод другого класса, нужно выполнить явное приведение к объекту этого класса, только тогда компилятор будет знать, что это за метод.
Но вообще так делать не надо, как ты хочешь сэкономить код. Методически. Нехорошо мешать разные логики (открытие и сохранение) в одну функцию.
Выносить нужно что-то действительно общее с точки зрения повторного использования, например, можешь сделать функцию GetFileDialogFilter, которая будет возвращать фильтр. Тогда, если фильтр изменится, тебе придется поправить всего одну функцию, а не несколько.
В твоем же случае (в общем) ты только роешь себе яму, мешая две логики. При изменении одной из них тебе придется невольно трогать и другую и, как следствие, потом снова ее тестировать.
Сделай лучше две разные функции и пусть каждая занимается своим делом, это называется "декомпозиция", так проще код поддерживать будет. Выделять же общие части лучше не по признаку похожести кода, а по логической и функциональной составляющей (функционал, возвращающий строку фильтра универсален, не зависит от вызывающего контента и может быть использован много раз, следовательно он - кандидат для выделения в отдельную функцию или константу). Хоть это и всего одна строка или пара выражений. Зато потом править легко
Пункт второй.
Точно не помню, что там и как, но тоже с таким давненько сталкивался. Попробуй у ячейки вызывть что-то вроде BeginEdit перед тем, как присваивать .Value (если она еще не в режиме редактирования) и что-то вроде EndEdit после..
Если нет, то я, к сожалению, не помню... Не люблю UI делать
P.S. где-то в интернете можешь поискать (наверняка есть) колонка для DataGridView с текстбоксиком и кнопочкой внутри. Типа, нажимаешь кнопочку (ellipse button я имею в виду) - срабатывает обработчик, в котором ты делаешь чего хочешь и возвращаешь объект, который будет значением ячейки, оно само проапдейтится
Я классы такой колонки сам писал как раз для того, чтобы диалоговые окна открывать.
NightWing (постов: 892) (5 октября 2007 г., 8:54)
Паллиативным решением по первому случаю было бы использование наиболее близкого базового абстрактного класса FileDialog у которого есть свойство Filter
FileDialog dlg;
if (this.dataGridView1.CurrentCell.ColumnIndex == 0){dlg = new OpenFileDialog();}else{dlg = new SaveFileDialog();}
Компилятор успокоится, но я бы на самом деле тут не стал смешивать. Кода попрождается байт на 30 лишнего, а вдруг при открытии какие-то события захочешь сделать...
Показаны элементы c 1 по 3 из 3


Добавить отзыв об этой странице Сообщить об ошибке