将复选框列添加到绑定到数据源的 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 等事件,也许还有其他一些事件,以持续更新您的列表。
我正在尝试向绑定到数据集的 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 等事件,也许还有其他一些事件,以持续更新您的列表。