如何将多个复选框列表数据绑定到一个 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
作为我们想要的列名称的方法可能会有所帮助把值,CheckedListBox
和 DataTable
和 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);
我希望这是有道理的。
错误:获取输出 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
作为我们想要的列名称的方法可能会有所帮助把值,CheckedListBox
和 DataTable
和 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);
我希望这是有道理的。