Эта проблема беспокоила меня в течение нескольких лет, и, возможно, кто-то здесь знает простое решение, так как я только что столкнулся с ней снова.
ВОПРОС: Есть ли способ заставить XtraGrid "забыть" текущееиндекс выделенной строки перед тем, как новый (другой) источник данных будет присвоен сетке?
ПРЕДПОСЫЛКИ Мы используем XtraGrid в качестве своего рода контроллера для того, что отображается на другой панели многопанельной Winform.
Теперь представьте гипотетический сценарий, в котором источник данных XtraGrid постоянно меняется в соответствии с выбором меню.Пункт меню 1 заполняет сетку списком сегодняшних блюд в кафетерии: Id, Name.Пункт меню 2 заполняет сетку списком клиентов, которым пользователь должен позвонить в этот день: ID, имя.Важно то, что это отдельные отдельные источники данных, и источник данных сетки назначается и переназначается.
КРИТИЧЕСКИЙ ФАКТ ДЛЯ ЭТОГО ВОПРОСА: Мы хотим, чтобы событие сетки FocusedRowChanged было единственное место , гдемы задерживаем выбор пользователя в сетке контроллера.Мы магазин "без спагетти кода".FocusedRowChanged лучше, чем событие щелчка, потому что он также обрабатывает навигацию с клавиатуры.Строка с фокусом содержит идентификатор подробной записи, которую нам нужно извлечь из базы данных для отображения на панели # 2.Это работает - большую часть времени .
Вот как это не работает: допустим, в определенный день список клиентов, с которыми пользователь должен связаться, содержит только одну строку.Таким образом, первая (и единственная) строка в сетке - это сфокусированная строка.Теперь предположим, что пользователь подходит к меню и выбирает пункт меню, чтобы отобразить закуски в кафетерии дня.Когда пользователь щелкает по первому элементу в списке записей, событие FocusedRowChanged НЕ запускается, поскольку сетка сохранила память индекса фокусированной строки из предыдущего источника данных.Сфокусированный ряд index не изменился.И поэтому выбор пользователя ничего не вызывает.
Я пытался заставить DevExpress предложить второй более объектно-ориентированный режим (в отличие от подхода, ориентированного на индекс строки), в соответствии с которым каждая строка в сеткебудет иметь GUID, и событие FocusedRowChanged будет срабатывать всякий раз, когда GUID текущей фокусированной строки отличается от GUID ранее сфокусированной строки, независимо от того, совпадает ли индекс фокусированной строки.Это позволило бы динамические изменения источника данных и включить желаемое поведение.Но они отказались.
Поэтому я снова задам свой вопрос: есть ли способ заставить XtraGrid «забыть» текущий фокусированный индекс строки, прежде чем новый источник данных будет присвоен сетке?