【问题标题】:How to maintain selected row of XtraGrid control如何维护 XtraGrid 控件的选定行
【发布时间】:2011-04-02 07:41:23
【问题描述】:

我正在该应用程序中开发 xtragridview 控件的应用程序,当我在打开一个弹出表单时双击 xtragridview 中的行时。然后父窗口的焦点发生变化并将焦点分配给另一个窗体 popup 。那时我选择的行改变了它的状态&它从 xtrgridview 中聚焦/选择默认的第一行。 但是如果用户将焦点从一个表单更改为另一个弹出表单,我想保持焦点/选定的行。

这个解决方案有什么解决方案吗?我应该为这个问题设置 xtragridview 控件的哪些属性?

谢谢.....

【问题讨论】:

    标签: c# winforms devexpress xtragrid


    【解决方案1】:

    通常,您使用的方法不需要您编写额外的代码。如果您通过双击网格行打开表单,XtraGrid 不会重置其 FocusedRow。所以,我建议你确定这种行为的原因。这可以通过使用以下方法来完成:

    1) 处理 GridView 的 FocusedRowChanged 事件并在其中设置断点。

    2) 重现问题并检查哪些代码强制 gridView 聚焦第一行。

    这应该可以说明为什么会发生这种情况。

    另外,我建议您查看实现所需功能的How to create the PopupForm for editing rows in the GridView and automatically create editors based on the column editors. 示例。

    我想我知道这个问题的原因。它出现是因为您正在更改 DataView 的 RowFilter 属性。我想你希望你的编辑指向被点击的记录。最好的解决方案是不过滤 DataView,而是分配 BindingContext,就像在上面的示例中所做的那样。这是其中的代码:

    public EditForm(Point location, GridColumnCollection columns, object dataSource, BindingContext context)
                : this() {
                StartPosition = FormStartPosition.Manual;
                Location = location;
                BindingContext = context;  // <<<<<<
                allowTrackValueChanges = false;
                this.dataSource = dataSource;
    ...
    }
    

    【讨论】:

    • 你绝对是赖特。我正在使用数据视图的 filterrow 属性从数据视图中过滤或搜索特定记录。谢谢你的帮助。你能推荐一些关于你正在服用什么的文档吗?
    • 我应该使用什么来代替行过滤器来从数据视图中选择特定记录?
    • @priyanka,通常,您应该使用您发布的文章中的方法。在这种情况下,不需要过滤 DataView。绑定到同一数据源的编辑器将显示来自活动记录的数据,该记录将对应“浏览”表单中的活动记录。
    • 你很聪明,但我想更新我表中的那条记录,那么我应该如何使用你所说的来做到这一点?
    • @priyanka,看看我发布的代码。 DataSource 对象被传递给 EditForm。因此,如果单击 EditForm 的 OK 按钮,更改表格的行应该没有问题。
    【解决方案2】:

    方法一:

    在双击事件处理程序中只提到

    return;
    

    在所有过程(打开另一个表单等)完成之后。

    更好地理解你的问题后,我建议尝试方法2我希望它确实有效。

    方法二:

    在打开另一个表单或对话框之前先记录当前选定的索引..

    int index = datagridview.SelectedRows[0].Index;  //or xdatagrid.SelectedRows[0].Index;**
    

    然后在完成表单打开或其他程序后添加以下行

    datagridview.Rows[index].Selected = true; //or xdatagrid.Rows[index].Selected = true;**
    

    **注:我从未使用过 xdatagrid,但根据我的 datagridview 经验建议解决方案。

    【讨论】:

    • 我使用了 gridview 的双击事件,在这种情况下它不提供 Handled 属性。还有其他解决办法吗?
    • @priyanka:添加return; 语句而不是e.Handled = true; 请参阅上面的代码以了解清楚
    • 它不工作。因为我使用 dataview 作为 xtragrid 视图的数据源,当用户双击特定行时,我更改了 dataview 的过滤器行属性。 & 在我的整个应用程序中使用了相同的数据视图。这就是为什么我无法保持所选行的焦点。有没有别的想法?感谢您的帮助。
    【解决方案3】:

    我用

     GridView view = (GridView) sender;
     Point pt = view.GridControl.PointToClient(Control.MousePosition);
     var info = DoRowDoubleClick(view, pt);
    

    当 DoRowDoubleClick 是:

     private static GridHitInfo DoRowDoubleClick(GridView view, Point pt) {
    
                GridHitInfo info = view.CalcHitInfo(pt);
    
                if (info.InRow || info.InRowCell){
    
                    string colCaption = info.Column == null ? "N/A" : info.Column.GetCaption();
    
                    MessageBox.Show(string.Format("DoubleClick on row: {0}, column: {1}.", info.RowHandle, colCaption));
                    return info;
                }
                return null;
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 2012-04-05
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多