这个问题困扰了我好几年,也许这里有人知道一个简单的解决方案,因为我又遇到了。
问题:有没有办法让 XtraGrid 在将新的(不同的)数据源分配给网格之前“忘记”当前的焦点行索引?
背景 我们使用 XtraGrid 作为一种控制器,用于显示在多窗格 Winform 的另一个面板中的内容。
现在想象一个假设场景,其中 XtraGrid 的数据源根据菜单选择不断变化。菜单项 1 使用自助餐厅中今天的主菜列表填充网格:ID、名称。菜单项 2 使用用户当天必须致电的客户列表填充网格:ID、姓名。重要的是这些是独立的不同数据源,并且正在分配和重新分配网格的数据源。
这个问题的关键事实:我们希望网格的 FocusedRowChanged 事件成为 我们在控制器网格中捕获用户选择的唯一位置。我们是一家“没有意大利面条代码”的商店。FocusedRowChanged 比单击事件更好,因为它也处理键盘导航。具有焦点的行包含我们需要从数据库中获取以显示在面板 #2 中的详细记录的 ID。这行得通——大多数时候。
这是它不起作用的原因:假设在给定的一天,用户必须联系的客户列表仅包含一行。所以网格中的第一(也是唯一)行是焦点行。现在假设用户进入菜单并选择菜单项以显示当天的自助餐厅主菜。当用户单击 Entrees 列表中的第一项时,FocusedRowChanged 事件不会触发,因为网格保留了来自前一个数据源的焦点行索引的内存。焦点行索引没有改变。因此用户的选择不会触发任何事情。
我试图让 DevExpress 提供第二种更面向行对象的模式(与面向行索引的方法不同),其中网格中的每一行都有一个 GUID,并且只要当前的 GUID 的 GUID 就会触发 FocusedRowChanged 事件聚焦行与先前聚焦行的 GUID 不同,无论聚焦行索引是否恰好相同。这将允许数据源的动态更改并启用所需的行为。但他们反对。
所以我会再次问我的问题,有没有办法让 XtraGrid 在将新数据源分配给网格之前“忘记”当前的焦点行索引?