如何将多个复选框列表数据绑定到 Gridview

问题描述

错误获取输出表在第一列之后的每一列中显示一些空白行。 此代码的工作原理是,有 4 个复选框列表,每个复选框列表包含 4 个列表项。选择每个列表项时,它应该显示在 指定列。

输出:每列在正确的位置有指定的行

private void button1_Click(object sender,EventArgs e)
        {
            Form2 fm = new Form2();
            DataTable dt = new DataTable();
            
            dt.TableName = "Foodorder";

            dt.Clear();
            dt.Columns.Add("WelcomeDrinks");
            dt.Columns.Add("Starter");
            dt.Columns.Add("MainMeals");
            dt.Columns.Add("Desserts");
                   
            for (int i = 0; i < chk1.Items.Count; i++)
            {
                if (chk1.GetItemChecked(i))
                {

                    DaTarow row = dt.NewRow();
                    row["WelcomeDrinks"] = (string)chk1.Items[i];
                    dt.Rows.Add(row);                                    
                }
            }
           
            for (int i = 0; i < chk2.Items.Count; i++)
            {
                              
                if (chk2.GetItemChecked(i))
                {
                    
                    DaTarow workrow = dt.NewRow();                 
                    workrow["Starter"] = (string)chk2.Items[i];
                   dt.Rows.Add(workrow);                                      

                }
            }
           
            for (int i = 0; i < chk3.Items.Count; i++)
            {
                if (chk3.GetItemChecked(i))
                {
                    DaTarow row = dt.NewRow();
                    row["MainMeals"] = (string)chk3.Items[i];
                    dt.Rows.Add(row);
                }
            }

           
            for (int i = 0; i < chk4.Items.Count; i++)
            {
                if (chk4.GetItemChecked(i))
                {             
                    DaTarow row = dt.NewRow();
                    row["Desserts"] = (string)chk4.Items[i];
                    dt.Rows.Add(row);
                }
            }


            fm.Grid1.DataSource = dt;

            fm.Show();

        }

解决方法

您忽略了在表中需要多少行。使用您当前的方法,为每个复选框列表中的每个复选框项目添加一个新行,然后您最终会在每行上只有一个项目。第一个复选框项目将有自己的行,每个复选框列表也是如此。它可能看起来像……


Welcome Drinks       Starter       MainMeal      Desserts
Welcome Drinks 1
Welcome Drinks 2
                    Starter1
                    Starter3
                                    Main Meal 1
                                    Main Meal 4
                                                    Dessert 3
                                                    Dessert 4

您需要做的是检查每个 CheckedListBox 并找出哪个复选框列表中选中的项目数最多。这将告诉您表中需要多少行。然后,不是在 for 循环中通过每个列表“添加”新行,只需使用列名将项目添加到现有行以确定值所在的单元格。

要获取包含最多“已选中”项的列表复选框可能看起来像……

int maxRows = chk1.CheckedItems.Count;
if (chk2.CheckedItems.Count > maxRows)
  maxRows = chk2.CheckedItems.Count;
if (chk3.CheckedItems.Count > maxRows)
  maxRows = chk3.CheckedItems.Count;
if (chk4.CheckedItems.Count > maxRows)
  maxRows = chk4.CheckedItems.Count;

然后将该行数添加到表格中。

for (int i = 0; i < maxRows; i++) {
  dt.Rows.Add();
}

现在表格应该有正确的列数和行数。

由于我们知道必须遍历每个 CheckedListBox 才能获取“已检查”项,因此如果我们创建一个方法,该方法采用 string 作为我们想要放置的列名,这可能会有所帮助值、CheckedListBoxDataTable 并且不返回任何内容。

AddColumnData 方法将循环遍历给定 CheckedListBox 中的每个“已检查”项,并将这些项添加到数据表中,从第一行和给定列名开始。这种方法可能看起来像……

private void AddColumnData(string colName,CheckedListBox checkedListBox,DataTable dt) {
  int curRowIndex = 0;
  DataRow row;
  foreach (var checkedItem in checkedListBox.CheckedItems) {
    row = dt.Rows[curRowIndex++];
    row[colName] = checkedItem;
  }
}

使用这种方法,可以更轻松地将项目添加到表中,如下所示......

AddColumnData("WelcomeDrinks",chk1,dt);
AddColumnData("Starter",chk2,dt);
AddColumnData("MainMeals",chk3,dt);
AddColumnData("Desserts",chk4,dt);

我希望这是有道理的。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...