在传输ListBox项时遇到麻烦,同时排除了已经存在的项

时间:2019-02-19 21:49:50

标签: c# asp.net

我正在创建一个应用程序,其中用户从下拉列表中选择汽车型号,这将导致从数据库中填充可用功能的列表框。用户可以选择单个功能,选择所有功能,删除功能或删除所有功能,这会将这些功能从可用的列表框来回传递到所选的列表框。我一切正常,但是很难从可用功能列表中仅添加所选功能列表中不存在的功能。

我的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());

                }
        }

如果我在所有项目都已被选中时尝试添加所有项目,则效果很好,但是如果选定的功能列表中已存在某些项目,则不会添加所有剩余的项目,而排除已经存在的项目。

>

2 个答案:

答案 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);