You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Infragistics UltraGrid程序化重选行时偶发额外选中首行问题

UltraGrid重载数据后二次操作首行额外选中问题解决

问题原因

UltraGrid在重新设置DataSource后,默认会自动选中第一行。第二次操作时,这个自动选中行为会和你程序化选中的行叠加,导致首行被额外选中——第一次操作后网格的默认选中逻辑可能被你的代码覆盖,但第二次绑定数据时,网格默认逻辑重新触发,而你的代码未提前清除所有选中状态,最终出现叠加选中的情况。

修复方案及修改代码

private List<int> _selectedRowsIds;

public Form1()
{
    InitializeComponent();
    ultraGrid1.DisplayLayout.Override.CellClickAction = CellClickAction.RowSelect;
    // 禁用网格自动选中首行的默认行为
    ultraGrid1.DisplayLayout.Override.RowSelectors = DefaultableBoolean.False;
}

private void button1_Click(object sender, EventArgs e)
{
    SaveSelectedRows();
    // 绑定新数据前清除所有选中状态
    ultraGrid1.Selected.Rows.Clear();
    Load();
    ReSelectRows();
}

private new void Load()
{
    var data = new List<Address>
    {
        new Address { Id = 1, Street = "rtdst", ZipCode = "11111", City = "dfgsdfg" },
        new Address { Id = 2, Street = "dfgdfg", ZipCode = "22222", City = "sfgdfg" },
        new Address { Id = 3, Street = "dfgdsf", ZipCode = "33333", City = "dfg" },
        new Address { Id = 4, Street = "dfgdfg", ZipCode = "44444", City = "dfgsd" },
        new Address { Id = 5, Street = "dfgdf", ZipCode = "55555", City = "dgsf dfgdfg" },
        new Address { Id = 6, Street = "dfgdfgdf", ZipCode = "66666", City = "dsgds dfg gdf gdfgds" }
    };

    ultraGrid1.DataSource = data;
}

public void SaveSelectedRows()
{
    _selectedRowsIds = ultraGrid1.Selected.Rows
        .Cast<UltraGridRow>()
        .Select(row => ((Address)row.ListObject).Id)
        .ToList();
}

public void ReSelectRows()
{
    if (_selectedRowsIds == null || !_selectedRowsIds.Any())
        return;

    // 重新选择前先清空所有选中状态
    ultraGrid1.Selected.Rows.Clear();
    ultraGrid1.ActiveRow = null;

    foreach (UltraGridRow row in ultraGrid1.Rows)
    {
        if (_selectedRowsIds.Contains(((Address)row.ListObject).Id))
        {
            row.Selected = true;
        }
    }

    _selectedRowsIds = null;
}
}

public class Address
{
    public int Id { get; set; }
    public string Street { get; set; }
    public string ZipCode { get; set; }
    public string City { get; set; }
}

关键修改说明

  • 绑定数据前清除选中状态:在button1_Click中,设置新数据源前调用ultraGrid1.Selected.Rows.Clear(),避免旧选中记录残留。
  • 重新选择前清空选中:在ReSelectRows开头先清除所有选中状态,确保网格无默认选中行后,再程序化选择目标行。
  • 禁用自动选中首行:在构造函数中配置RowSelectors = DefaultableBoolean.False,从根源关闭网格自动选中首行的默认行为,彻底避免此类问题。
  • 简化选中ID保存逻辑:用LINQ替代循环,让代码更简洁易读。

内容的提问来源于stack exchange,提问作者IngoB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 20:47:20