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
相关产品推荐
相关产品推荐

