问题描述
错误:获取输出表在第一列之后的每一列中显示一些空白行。 此代码的工作原理是,有 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
作为我们想要放置的列名,这可能会有所帮助值、CheckedListBox
和 DataTable
并且不返回任何内容。
此 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);
我希望这是有道理的。