【问题标题】:Unable to select multiple rows on infragistics ultrawingrid with a check box column无法使用复选框列选择 infragistics ultrawingrid 上的多行
【发布时间】:2015-11-04 20:56:51
【问题描述】:

我有下面的代码成功地将复选框列添加到 ultrawingrid,我的问题是,当我通过选中 Select 列上的复选框进行选择时,未更新 ultrawingrid 的选定行数,它仍然显示计数为零,我还想知道如何启用多复选框选择,即选择多行...

下面是代码...

private void grdPayVis_InitializeLayout(object sender,InitializeLayoutEventArgs e) 
 var gridBand = grdPayVis.DisplayLayout.Bands[0]; 
    if(!gridBand.Columns.Exists("Select"))
    gridBand.Columns.Add("Select", "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; 

}

【问题讨论】:

  • 选中或取消选中单元格并不意味着从 SelectedRows 集合中添加或删除该行。如果要保留选中单元格的列表,则应使用 BeforeCellUpdate 或 AfterCellUpdate 或在行上循环并查看复选框单元格的值(这是将布尔列添加到 DataSource 的原因之一网格更好)
  • 如何在网格上选择多行,它不像复选框,而是像单选按钮一样,选中第二个框会取消选中第一个复选框已经选中...@Steve
  • @Steve 您能否介绍一下如何进行多选以及如何向数据源添加新列,因为所使用的存储过程正在应用程序的各个页面中使用,并且无法真正改变它
  • 您不会更改存储过程。您从存储过程(我想是 DataTable)中获取结果,然后向其中添加一个新的(位/布尔值)DataColumn,将其默认设置为 false 并将 DataTable 设置为网格的 DataSource。现在,对于网格知识,它应该自动更新该字段。使用 DataTable Select 方法可以简单地选择检查设置为 true 的行。如何设置网格的 DataSource?你能添加那个代码吗?
  • @Steve 这是下面设置数据源的代码

标签: c# checkbox infragistics ultrawingrid


【解决方案1】:

我不确定您实际上想要实现什么。当您将 Select 列中的 CellClickAction 设置为 Edit,然后单击此列中的任何单元格时,网格将选择该单元格而不是排。 Grid 具有Selected 属性,它公开了三个集合——行、列和单元格。在您的情况下,您正在更改选定的单元格并且不更改选定的行集合。如果您需要选择行,您需要将 Select 列中的 CellClickAction 设置为 RowSelect。如果您需要同时改变 Select 列的复选框状态,您可以像这样处理网格的 AfterSelectChange 事件:

private void grdPayVis_AfterSelectChange(object sender, AfterSelectChangeEventArgs e)
{
    if (e.Type == typeof(UltraGridRow))
    {
        foreach (UltraGridRow row in this.grdPayVis.Selected.Rows)
        {
            row.Cells["Select"].Value = true; // Or some value appropriate to your scenario
        }

        this.grdPayVis.UpdateData();
    }   

默认情况下,网格允许您选择许多单元格、行或列。但是,当有一个单元格处于编辑模式时,您无法选择任何其他单元格。同样,当您单击 Select 列中的任何单元格时,您已将 CellClickAction 设置为 Edit,它会进入编辑模式,并且无法选择更多单元格在退出编辑模式之前。

【讨论】:

    【解决方案2】:

    您可以在从数据库读取数据表后向数据表添加一个新列

    ds = new DataSet("PayCharge"); 
    ds= obj.GetData(); 
    DataColumn dc = new DataColumn("Select", typeof(boolean));
    dc.DefaultValue = false;
    ds.Tables[0].Columns.Add(dc);
    grdVisPay.SetDataBinding(ds, "PayCharge");  
    .....
    

    现在,数据集中的第一个表有一个名为 Select 的未绑定列,当您将其设置为数据源时,您将能够像以前那样进行操作。但这一次,只要您触摸复选框,就会在基础数据表中设置 True/False 值。当您需要发现您使用数据源而不是网格时检查的行是什么时。例如

    void buttonSave_Click(object sender, EventArgs e)
    {
         DataSet ds = grdVisPay.DataSource as DataSet;
         DataRows[] selectedRows = ds.Tables[0].Select("Select = True");
         foreach(DataRow row in selectedRows)
         {
             ... do whatever you need with the selected row...
    
         }
    }
    

    【讨论】:

    • @Steve非常感谢您的回复,但这仍然不允许多行选择,我在数据集中添加了一个新的数据列,但我仍然无法选中多个复选框..跨度>
    • 所以如果你点击复选框没有任何反应?您可以编辑其他单元格吗?
    • 当我选中网格上的复选框并单击该 winform 上的文本框控件时,复选框选择无法保留,它再次取消选中自身,我也无法编辑其他单元格网格,网格的这种行为怎么处理...
    • 您的网格事件处理程序发生了什么事?
    • 我有这个网格的三个事件处理程序,Initializelayout、Initializerow、CellChangeevent。单元格更改事件是通过复选框选择来处理行的选择:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多