WinForm(VB.NET)中Infragistics UltraGrid跨数据源合并字段咨询
解决WinForm VB.NET中Infragistics UltraGrid合并字段的问题
为什么设计器修改不生效?
设计器里的列配置基于初始静态数据源,一旦运行时给UltraGrid绑定动态数据源(比如第一个Grid指定的数据源、第二个Grid的SQL查询结果),Grid会自动根据数据源结构重新生成列,设计器手动添加的列会被覆盖,因此不生效。
两种解决方案:
1. 数据源层面合并(推荐的快捷方式)
如果两个数据集存在关联键(比如主键ID),最省心的方式是直接在数据源层面合并,无需修改Grid设置:
- 若第一个Grid的数据源也是SQL查询,直接修改查询语句,用
JOIN关联第二个Grid的SQL查询结果,把需要的字段包含进来。示例:SELECT t1.*, t2.TargetField FROM Table1 t1 LEFT JOIN (第二个Grid的SQL查询语句) t2 ON t1.ID = t2.ID - 若第一个Grid的数据源是DataTable,第二个也是SQL查询得到的DataTable,可使用
DataTable.Merge方法(需确保两表有匹配主键),或手动给第一个DataTable添加列后,通过关联键批量填充数据。
2. 代码实现动态合并
如果无法修改数据源(比如第一个数据源来自非SQL渠道),可通过代码手动处理:
- 第一步:给第一个Grid的数据源添加目标字段
' 假设第一个Grid的数据源是DataTable Dim dtFirst As DataTable = DirectCast(UltraGrid1.DataSource, DataTable) ' 根据实际字段类型调整,添加要合并的字段 If Not dtFirst.Columns.Contains("SecondGridField") Then dtFirst.Columns.Add("SecondGridField", GetType(String)) End If - 第二步:根据关联键匹配并填充数据
Dim dtSecond As DataTable = DirectCast(UltraGrid2.DataSource, DataTable) ' 遍历第一个表的行,匹配第二个表的数据 For Each rowFirst As DataRow In dtFirst.Rows ' 替换为你的实际关联字段(比如ID) Dim matchRow = dtSecond.AsEnumerable().FirstOrDefault(Function(r) r("ID").ToString() = rowFirst("ID").ToString()) If matchRow IsNot Nothing Then ' 替换为你要合并的目标字段名 rowFirst("SecondGridField") = matchRow("TargetField").ToString() End If Next ' 刷新Grid显示 UltraGrid1.Refresh() - 额外:若需动态给Grid添加列(未提前在数据源中添加),可在
UltraGrid1_InitializeLayout事件中处理:Private Sub UltraGrid1_InitializeLayout(sender As Object, e As InitializeLayoutEventArgs) Handles UltraGrid1.InitializeLayout ' 添加列并设置显示属性 Dim newCol As UltraGridColumn = e.Layout.Bands(0).Columns.Add("SecondGridField") newCol.Header.Caption = "从第二个Grid合并的字段" newCol.Visible = True End Sub
内容的提问来源于stack exchange,提问作者liraz shitrit
相关产品推荐
相关产品推荐

