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

How to Databind multiple Checkboxlist into a Gridview

错误:获取输出 table 在第一列之后的每列中显示一些空白行。 此代码的作用是,有 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();

        }

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


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

您需要做的是检查每个 CheckedListBox 并找出哪个复选框列表的项目数量最多。这将告诉您 table 中需要多少行。然后,不是在遍历每个列表的 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;

然后将该行数添加到 table。

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

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

因为我们知道我们必须遍历每个 CheckedListBox 来获取“已检查”的项目,如果我们创建一个采用 string 作为我们想要的列名称的方法可能会有所帮助把值,CheckedListBoxDataTable 和 returns 什么都没有。

AddColumnData 方法将遍历给定 CheckedListBox 中的每个“选中”项目,并将这些项目添加到数据 table 从第一行开始,然后给定的列名。这个方法可能看起来像……

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;
  }
}

使用此方法,可以更轻松地将项目添加到 table,如下所示...

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

我希望这是有道理的。