【问题标题】:Is it possible to get index of selected items in DataGridViewCheckBoxColumn?是否可以在 DataGridViewCheckBoxColumn 中获取所选项目的索引?
【发布时间】:2019-08-20 19:51:38
【问题描述】:

我正在尝试在CheckBoxColumn 中获取所选Rows 的索引,但到目前为止我没有看到CheckedIndex 的属性这可能吗?

 public void LoadPartListView()
    {
        using (productionDataSet = new _KUKA_Sorting_Buffer_ProductionDataSet())
        {
            using (parT_PRODUCTION_LISTTableAdapter)
            {
                dataTable = new _KUKA_Sorting_Buffer_ProductionDataSet.PART_PRODUCTION_LISTDataTable();
                parT_PRODUCTION_LISTTableAdapter.Fill(dataTable);
            }
        }
        for (int i = 0; i < dataTable.Rows.Count; i++)
        {

            partOrderListView.Add(new TestPartOrderListView
            {
                SortingTowerNumber = dataTable.Rows[i].ItemArray[(int)ProductListTable.SORTING_TOWER].ToString(),
                CustomerOrderName = dataTable.Rows[i].ItemArray[(int)ProductListTable.CUSTOMER].ToString(),
                CabinetName = dataTable.Rows[i].ItemArray[(int)ProductListTable.UPI_ARTICLE].ToString(),
                PackageNumber = dataTable.Rows[i].ItemArray[(int)ProductListTable.UPI_PACKAGE].ToString(),
                PartName = dataTable.Rows[i].ItemArray[(int)ProductListTable.NAME].ToString(),
                Barcode = dataTable.Rows[i].ItemArray[(int)ProductListTable.BARCODE].ToString(),
                LocationRow = dataTable.Rows[i].ItemArray[(int)ProductListTable.FIRST_ROW].ToString(),
                LocationColumn = dataTable.Rows[i].ItemArray[(int)ProductListTable.FIRST_COLUMN].ToString()
            });
        }
        DataGridViewCheckBoxColumn checkedColumn = new DataGridViewCheckBoxColumn();
        checkedColumn.HeaderText = "Check Items";
        advancedDataGridView1.Columns.Add(checkedColumn);

        //Get the checked indexes from checkedColumn

        bindingSource.DataSource = dataTable;

        switch (sortingTowerButtonPressed)
        {
            case 1:
                bindingSource.Filter = $"(Convert([SORTING_TOWER],System.String) IN ('{sortingTowerButtonPressed}'))";
                break;
            case 2:
                bindingSource.Filter = $"(Convert([SORTING_TOWER],System.String) IN ('{sortingTowerButtonPressed}'))";
                break;
            case 3:
                bindingSource.Filter = $"(Convert([SORTING_TOWER],System.String) IN ('{sortingTowerButtonPressed}'))";
                break;
            case 4:
                bindingSource.Filter = $"(Convert([SORTING_TOWER],System.String) IN ('{sortingTowerButtonPressed}'))";
                break;
        }
        advancedDataGridView1.Enabled = true;
        advancedDataGridView1.ReadOnly = false;


    }

我应该为此做一些event 吗?我真的需要帮助

【问题讨论】:

标签: c# forms


【解决方案1】:

您正在使用 TableAdapters 和强类型 DataTable;你的代码不应该是这样的。我在 cmets 中链接了一个答案,为同样在强类型表中访问数据的其他人提供了类似的建议,这是一种艰难的方式。

简而言之,您的代码应该看起来更像这样:

    for (int i = 0; i < dataTable.Count; i++)
    {
        var ro = dataTable[i]; //retrieve a strongly typed data row, not a base DataRow (do NOT use the .Rows property)

        partOrderListView.Add(new TestPartOrderListView
        {
            SortingTowerNumber = ro.SORTING_TOWER, //or whatever the column name is
            CustomerOrderName = ro.CUSTOMER, //column name etc
            ...
        });
    }

至于我建议您如何允许用户从网格中选择一些行:

向强类型数据表添加一列,布尔类型

数据表不应该是数据库中表的精确副本;它可以有自己的与数据库数据无关的属性和列、计算等。通过添加一个布尔列,然后将该列添加到网格(显式地或通过依赖网格的autogeneratecolumns = true 设置),网格将获得一个复选框列,该列操纵该行上的布尔值。

然后,用户可以根据自己的需要勾选方框并按下按钮。 datagridview 将存储用户在它绑定的数据表中勾选的布尔值,因此您可以简单地迭代或过滤数据表。假设当我们将列添加到数据集中的数据表时,我们调用了列UserChoseThisRowBoolean

    for (int i = 0; i < dataTable.Count; i++)
    {
        var ro = dataTable[i]; 
        if(!ro.UserChoseThisRowBoolean) //if the user didn't tick this row
          continue; //skip on
        partOrderListView.Add(new TestPartOrderListView
        {
            SortingTowerNumber = ro.SORTING_TOWER,
            CustomerOrderName = ro.CUSTOMER,
            ...
        });
    }

我们也可以用过滤器点击它,然后迭代数据视图:

dataTable.DefaultView.Filter = "[UserChoseThisRowBoolean] = True";
foreach(DataViewRow dvro in dataTable.DefaultView)  
  var ro = dvro.Row as YourDataRowType;

或者我们可以使用 LINQ:

dataTable.AsQueryable().Where(ro => ro.UserChoseThisRowBoolean)

但我可能更喜欢你的情况下的循环形式

【讨论】:

    【解决方案2】:

    试试下面的代码,粘贴在按钮点击事件里面进行测试

    //Name of Grid View : dataGridView1
    //Name of Column : CheckBoxColumn1
    
    
           private void button1_Click(object sender, EventArgs e)
            {
                // Place this code where you want to know the index
                for (int i = 0; i < dataGridView1.Rows.Count; i++)
                {
                    if (Convert.ToBoolean(dataGridView1.Rows[i].Cells[CheckBoxColumn1.Name].Value) == true) {
                        MessageBox.Show("Index " + i); // Show index in message box or add to a list for further processing 
                    }
    
                }
                //
            }
    

    【讨论】:

      猜你喜欢
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      • 2019-04-22
      • 2017-04-22
      相关资源
      最近更新 更多