我正在创建一个应用程序,其中用户从下拉列表中选择汽车型号,这将导致从数据库中填充可用功能的列表框。用户可以选择单个功能,选择所有功能,删除功能或删除所有功能,这会将这些功能从可用的列表框来回传递到所选的列表框。我一切正常,但是很难从可用功能列表中仅添加所选功能列表中不存在的功能。
我的C#代码后面:
protected void btnSelectAll_Click(object sender, EventArgs e)
{
for (int i = 0; i < lbOptionsAvailable.Items.Count; i++)
if (lbOptionsSelected.Items.Contains(lbOptionsAvailable.Items[i]))
{
lbOptionsSelected.Items.Remove(Items[i].ToString());
}
else
{
lbOptionsSelected.Items.Add(lbOptionsAvailable.Items[i].ToString());
}
}
如果我在所有项目都已被选中时尝试添加所有项目,则效果很好,但是如果选定的功能列表中已存在某些项目,则不会添加所有剩余的项目,而排除已经存在的项目。
>答案 0 :(得分:0)
您正在正确检查列表是否包含索引i的项目,但是您是否不应该只是添加和删除项目本身呢?
protected void btnSelectAll_Click(object sender, EventArgs e)
{
for (int i = 0; i < lbOptionsAvailable.Items.Count; i++)
if (lbOptionsSelected.Items.Contains(lbOptionsAvailable.Items[i]))
{
lbOptionsSelected.Items.Remove(lbOptionsAvailable.Items[i]);
}
else
{
lbOptionsSelected.Items.Add(lbOptionsAvailable.Items[i]);
}
}
答案 1 :(得分:0)
如果需要找到一种方法来在选定和未选定(需要添加的项目)之间合并项目。
希望您使用DataTable。 DataTable提供过滤器选项和合并API。 这将有助于您的情况和调试。 但您需要在合并项目之前检查并更新所选项目。 但是请确保使用DataTable不是实现目标的简便方法。
使用如下所示的数据表
dtData.Columns.Add(new DataColumn("id", typeof(System.Int32)));
dtData.Columns.Add(new DataColumn("name", typeof(System.String)));
dtData.Columns.Add(new DataColumn("selected", typeof(bool)));
string[] vList = new string[] { "A", "B", "C" };
DataRow dRow = null;
for (int index = 0; index < vList.Length; index++)
{
dRow = dtData.NewRow();
dtData.Rows.Add(dRow);
dRow[0] = index;
dRow[1] = vList[index];
dRow[2] = false;
}
//don't miss binding "defaultView"
this.listBox1.DataSource = dtData.DefaultView;
this.listBox1.DisplayMember = "name";
this.listBox1.ValueMember = "selected";
dtData.Rows[0][2] = true;
//this will allow filter item that you don't need to show.
dtData.DefaultView.RowFilter = string.Format("selected='{0}'", bool.FalseString);
此外,“选择列”可能需要根据用户选择进行更新
for(int index = 0; index < this.listBox1.SelectedItems.Count; index++)
{
DataRowView dRowView = this.listBox1.SelectedItems[index] as DataRowView;
dRowView["selected"] = true;
}
//and merge with your Available items
DataTable dtNewItems = new DataTable();
dtNewItems.Columns.Add(new DataColumn("id", typeof(System.Int32)));
dtNewItems.Columns.Add(new DataColumn("name", typeof(System.String)));
dtNewItems.Columns.Add(new DataColumn("selected", typeof(bool)));
//and merge it
DataTable dtSelected = dtData.DefaultView.ToTable();
dtSelected.Merge(dtNewItems);