Возникла у меня в приложении проблемка: при смене фильтра в моем гриде пропадало "выделение" строки, т.е. строка есть, ее видно, но она просто не "выделена". А выделение строки очень важно: кнопки Delete/Print и многие другие работают с выделенными записями, т.е. нет выделенных записей - кнопки недоступны.
И в результате поведение моего приложения выглядело ужасно: сменил пользователь фильтр, видит в гриде нужную запись, а удалить ее не может, потому что кнопка Delete недоступна. Кто виноват? Конечно же программист!
Я для этого сценария сделал костылик и написал тест с проверкой выделенных записей в этом сценарии:
[Test]
public void ChangeCollectionCriteriaFromEmptyToOneItem_V1() {
using(Form form = new Form()) {
Grid grid = new Grid();
KeepSelectedRowsHelper helper = new KeepSelectedRowsHelper();
helper.Attach(grid);
grid.Parent = form;
form.Show();
..
list.Criteria = "empty list";
grid.DataSource = list;
Assert.AreEqual(0, list.Count);
Assert.AreEqual(0, grid.RowCount);
Assert.AreEqual(0, grid.GetSelectedRows().Count);
Assert.AreEqual(Grid.InvalidRowHandle, grid.FocusedRowHandle);
col.Criteria = null;
Assert.AreEqual(1, list.Count);
Assert.AreEqual(1, grid.RowCount);
Assert.AreEqual(0, grid.FocusedRowHandle);
Assert.AreEqual(1, grid.GetSelectedRows().Count);
}
}
Это было несколько лет назад. И вот я снова бодаюсь с этим сценарием: почему-то костылик перестал работать, там что-то авторы грида изменили. Плохо конечно, что сломали, но зато и починили быстро.
Только в процессе проверки "как починили" я неожиданно выяснил что и без моего костылика все работает!
А костылик-то немаленький, сильно грид переколбашивает:
grid.BeginSelection();
try {
grid.ClearSelection();
grid.SelectRow(rowHandle);
grid.FocusedRowHandle = rowHandle;
}
finally {
grid.EndSelection();
}
Как же так вышло? Вроде и код писал "по методологии", и тест правильный, но в результате только тормозов добавил в эту операцию, да поимел ненужный код...
Такая ситуация у меня возникает не в первый раз и сейчас шаблон такого теста у меня изменился, я проверяю два варианта:
- "правильно работает с моим кодом"
- "НЕправильно работает без моего кода"
[Test]
public void ChangeCollectionCriteriaFromEmptyToOneItem_V2() {
ChangeCollectionCriteriaFromEmptyToOneItem_V2(true);
ChangeCollectionCriteriaFromEmptyToOneItem_V2(false);
}
private void ChangeCollectionCriteriaFromEmptyToOneItem_V2(bool enableHelper) {
if(enableHelper) {
KeepSelectedRowsHelper helper = new KeepSelectedRowsHelper();
helper.Attach(grid);
}
..
col.Criteria = null;
Assert.AreEqual(1, list.Count);
Assert.AreEqual(1, grid.RowCount);
Assert.AreEqual(0, grid.FocusedRowHandle);
if(enableHelper) {
Assert.AreEqual(1, grid.GetSelectedRows().Count);
}
else {
}
public void ChangeCollectionCriteriaFromEmptyToOneItem_V2() {
ChangeCollectionCriteriaFromEmptyToOneItem_V2(true);
ChangeCollectionCriteriaFromEmptyToOneItem_V2(false);
}
private void ChangeCollectionCriteriaFromEmptyToOneItem_V2(bool enableHelper) {
if(enableHelper) {
KeepSelectedRowsHelper helper = new KeepSelectedRowsHelper();
helper.Attach(grid);
}
..
col.Criteria = null;
Assert.AreEqual(1, list.Count);
Assert.AreEqual(1, grid.RowCount);
Assert.AreEqual(0, grid.FocusedRowHandle);
if(enableHelper) {
Assert.AreEqual(1, grid.GetSelectedRows().Count);
}
else {
Assert.AreEqual(0, grid.GetSelectedRows().Count);
}
}}
}
И в дополнение я тщательно выбираю ситуации, когда мой код должен работать:
if(grid.ContainsSortedColumn && grid.IsServerMode && (grid.MultiSelect == true))
В других ситуациях грид и сам сразу работает как мне хотелось бы и нечего в его правильную работу влезать со своим тормознутым костыликом.
Комментариев нет:
Отправить комментарий