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

时间:2015-11-02 19:11:12

标签: winforms infragistics ultrawingrid

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

史蒂夫上面的答案很好,但它可以通过几种方式简化并变得更好。

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

此外,如果添加未绑定列,则它的默认DataType是字符串,这对CheckBox列没有多大意义。通过将DataType设置为bool,您可以避免设置样式,并且还可以清除默认情况下每个单元格不确定的问题。

    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信息的单元格。用户输入单元格并打算输入日期,例如' 1/19 / 2015'。当用户开始输入时,他首先输入' 1'。如果此时检查单元格的值,则网格无法将单元格中的当前文本(" 1")转换为日期。因此,网格不会尝试使用该值更新基础数据源,直到其他情况发生,例如用户离开单元格或丢失对网格的关注。

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

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

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

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

最后,网格不会保留任何类型的“已检查”列表。细胞。但是你可以自己做到这一点而不会有太多困难。您需要做的是在绑定网格后立即构建初始列表。然后捕获CellChange,AfterRowAdded,BeforeRowDeleted以及其他一些事件,以便持续保持列表的最新状态。