将复选框列添加到绑定到数据源的 infragistics ultrawingrid

Adding a checkbox column to the infragistics ultrawingrid that is bind to a datasource

我正在尝试向绑定到数据集的 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;

}

Swetha

当网格将其数据源设置为数据表或其他绑定源时,它会自动创建数据表或数据源属性中的列。如果你想拥有另一列,你需要先添加它,然后再尝试从 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; 
} 

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

首先,很多代码并不是真正必要的。例如,列的默认 Hidden 状态为 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);
        }
    }

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

当然,如果单元格有一个复选框,那么这个问题就不存在了,因为用户无法输入无效值,但网格仍然以相同的方式工作并且直到用户离开单元格。

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

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

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

最后,网格不保留任何类型的 'checked' 单元格列表。但是您可以自己轻松完成此操作。您需要做的是在绑定网格后立即构建初始列表。然后捕获 CellChange、AfterRowAdded、BeforeRowDeleted 等事件,也许还有其他一些事件,以持续更新您的列表。