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