2013-03-06 58 views
2

有没有一种方法可以根据其中一列(ID列)的值选择UltraWire行中的一行?我一直在试图找出如何做到这一点,并取得一点成果。Ultrawingrid - 根据唯一值选择行

我有一个全局变量,它是'活动ID'(即当前在应用程序中正在编辑的ID - 它是系统认为被选中并激活的ID) - 但有时会选中网格和“选定ID”变量不匹配。我需要确保他们是相同的,以防止用户混淆。我希望能调用刷新()函数中的以下代码...

也许类似(有点伪码-ISH):

int index; // This could be any number 

foreach (row r in grid) 
{ 
    if (row.cell["ID"].value = index) 
     grid.selectedindex = thisRow; 
} 

上午我沿着正确的线路在想什么?如果是这样,那么正确的语法是什么?如果不是,我该怎么做呢?

回答

3

明白了。

  int index; 
      foreach (UltraGridRow row in grid.Rows) 
      { 
       if (Convert.ToInt32(row.Cells["ID"].Value) == index) 
       { 
        grid.ActiveRow = row; 
        break; 
       } 
      } 

作品只是我怎么需要它 - 对不起,回答我的问题;)

+4

添加一个'break;'到你的循环当你找到值时退出 – Steve 2013-03-06 16:08:01

+0

思考好的史蒂夫,谢谢:) – 2013-03-07 12:23:28

0

如果您绑定到数据表或具有由键,你可以找到一个项目的能力清单使用Rows集合的GetRowWithListIndex方法来查找UltraGridRow。

例如下面会激活一行的5键:

DataTable dt = this.ultraGrid1.DataSource as DataTable; 
DataRow dr = dt.Rows.Find(5); 
this.ultraGrid1.Rows.GetRowWithListIndex(dt.Rows.IndexOf(dr)).Activate(); 

如果列表不支持通过寻找关键的一个项目,你可以使用LINQ在列表中找到的物品好。有一个例子找到链接here的项目。

3

是的。您可以使用FirstOrDefault功能找到匹配的行标准:

var row = ultraGrid1.Rows.FirstOrDefault(r => r.Cells["Id"].Value.ToString() == "1"); 

现在你(可能)有其中该细胞含有你想要的值的行,你可以激活它,选择它:

if (row != null) 
row.Activate(); 
+0

你能否给代码唯一的答案增加一些解释,所以对于想要了解解决方案,请吗? – 2015-12-14 22:38:22

0

如果您有多个波段,你可以使用以下命令:

int index; 

ultraGrid1.DisplayLayout.Bands.OfType<Infragistics.Win.UltraWinGrid.UltraGridBand>() 
    .SelectMany(s => s.GetRowEnumerator(Infragistics.Win.UltraWinGrid.GridRowType.DataRow) 
    .OfType<Infragistics.Win.UltraWinGrid.UltraGridRow>()) 
    .Where(s => s.Cells.Exists("ID")) 
    .FirstOrDefault(s => (int)s.Cells["ID"].Value == index)? 
    .Activate(); 

注:(?)空,条件运算需要C#6.0或更高版本。否则,你必须检查,如果FirstOrDefault(...)!=null然后激活它。