【问题标题】:Adding a checkbox column to the infragistics ultrawingrid that is bind to a datasource将复选框列添加到绑定到数据源的 infragistics ultrawingrid
【发布时间】:2026-02-15 22:50:01
【问题描述】:

我正在尝试向绑定到数据集的 ultrawingrid 添加一个新的复选框列,当我添加一个新列时,它会说找不到密钥,关于如何修复它的任何想法,谢谢...

下面是代码

private void grdPayVis_InitializeLayout(object sender, InitializeLayoutEventArgs e)
{

    var gridBand = grdPayVis.DisplayLayout.Bands[0];

    gridBand.Columns["Select"].Header.Caption = "Select";
    gridBand.Columns["Select"].Header.Appearance.TextHAlign = HAlign.Center;
    gridBand.Columns["Select"].Header.VisiblePosition = 0;
    gridBand.Columns["Select"].Hidden = false;
    gridBand.Columns["Select"].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.CheckBox;
    gridBand.Columns["Select"].AutoSizeMode = ColumnAutoSizeMode.AllRowsInBand;
    gridBand.Columns["Select"].CellActivation = Activation.AllowEdit;
    gridBand.Columns["Select"].CellAppearance.TextHAlign = HAlign.Center;
    gridBand.Columns["Select"].CellClickAction = CellClickAction.Edit;

}

斯维塔

【问题讨论】:

    标签: winforms infragistics ultrawingrid


    【解决方案1】:

    史蒂夫上面的回答很好,但可以通过多种方式简化和改进。

    首先,很多代码并不是真正需要的。例如,列的默认隐藏状态为 false,因此无需设置。 AutoSizeMode 和 CellClickAction 相同。

    另外,如果你添加一个未绑定的列,它的默认 DataType 是字符串,这对于 CheckBox 列没有多大意义。通过将 DataType 设置为 bool,您可以避免设置 Style 的需要,也可以解决默认情况下每个单元格都不确定的问题。

        private void ultraGrid1_InitializeLayout(object sender, Infragistics.Win.UltraWinGrid.InitializeLayoutEventArgs e)
        {
            UltraGridLayout layout = e.Layout;
            UltraGridBand rootBand = layout.Bands[0];
    
            if (false == rootBand.Columns.Exists("Select"))
            {
                UltraGridColumn checkBoxColumn = rootBand.Columns.Add("Select");
                checkBoxColumn.Header.VisiblePosition = 0;
                checkBoxColumn.DataType = typeof(bool);
            }
        }
    

    至于确定单元格的值并跟踪“选定”行,您必须了解一点关于网格单元格编辑器的工作原理。要真正理解它,请想象一个包含 DateTime 信息的单元格。用户进入单元格并打算输入日期,例如“2015 年 1 月 19 日”。当用户开始键入时,他首先键入“1”。如果此时检查单元格的值,则网格不可能将单元格中的当前文本(“1”)转换为日期。因此,正因为如此,网格不会尝试使用该值更新底层数据源,直到发生其他事情,例如用户离开单元格或失去对网格的关注。

    当然,如果单元格有复选框,则不存在此问题,因为用户无法输入无效值,但网格仍然以相同的方式工作,直到用户更新值离开细胞。

    所以...当您处理任何未处于编辑模式(当前未激活)的单元格时,您可以可靠地使用单元格的 Value 属性。当单元格处于编辑模式(处于活动状态)时,您不能依赖从数据源读取的值,您必须使用单元格的文本。

    因此,给定布尔(复选框)列中的任何单元格,要准确反映屏幕上复选框的当前状态,您可以执行以下操作:

        private bool GetCheckBoxCellCurrentValue(UltraGridCell cell)
        {
            if (cell.IsInEditMode)
                return bool.Parse(cell.Text);
            else
                return (bool)cell.Value;
        }
    

    最后,网格不会保留任何类型的“已检查”单元格列表。但是你可以自己做,没有太多困难。您需要做的是在绑定网格后立即构建初始列表。然后捕获诸如 CellChange、AfterRowAdded、BeforeRowDeleted 之类的事件,也许还有其他一些事件,以不断更新您的列表。

    【讨论】:

      【解决方案2】:

      当网格将其数据源设置为数据表或其他绑定源时,它会自动创建存在于数据表或数据源属性中的列。如果您想拥有另一列,则需要在尝试从 Band 列中引用它之前添加它

      private void grdPayVis_InitializeLayout(object sender, InitializeLayoutEventArgs e) 
      {
          var gridBand = grdPayVis.DisplayLayout.Bands[0]; 
      
          // Check if the column exists, if not, add it
          if(!gridBand.Columns.Exists("Select"))
              gridBand.Columns.Add("Select", "Select");
      
      
          // Not needed, the ADD adds the Key and the Caption
          // gridBand.Columns["Select"].Header.Caption = "Select"; 
      
          // Now you can reference the column with the Key = "Select"
          gridBand.Columns["Select"].Header.VisiblePosition = 0; 
          gridBand.Columns["Select"].Hidden = false; 
          gridBand.Columns["Select"].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.CheckBox; 
          gridBand.Columns["Select"].AutoSizeMode = ColumnAutoSizeMode.AllRowsInBand; 
          gridBand.Columns["Select"].CellClickAction = CellClickAction.Edit; 
      } 
      

      【讨论】:

      • 非常感谢您的回复,它运行良好,但在加载复选框时,复选框总是在检查字段中用一个迷你蓝色方块选中,我该如何删除它......我希望我的问题很清楚,如果不是请告诉我...
      • 很清楚。 CheckBox 未绑定到任何列,因此其初始值是不确定的。您可以使用 InitializeRow 方法设置该复选框所需的初始值,或者向绑定源添加具有初始真/假值的布尔列。如果可能的话,更喜欢最后一种方法。
      • 非常感谢您的回复,我最初尝试通过在表格中添加一列,但我无法正确检索所选单元格的值,我总是将该值设为 false当我检查单元格时
      • 如何获取上述网格中选定列的计数,当用户选中多个复选框时,我需要计数并循环遍历所选的每一行,在哪个事件上我可以获得正确的计数和在哪里可以执行循环...谢谢
      • ...我的意思是选定的行数而不是列数...抱歉造成混淆