【问题标题】:C# Find the Selected State of all items in a ListBoxC# 查找 ListBox 中所有项目的选定状态
【发布时间】:2019-01-31 06:39:04
【问题描述】:

我找到了很多关于如何在列表框中查找所选项目以及如何遍历列表框的示例;

for(int index=0;index < listBox1.Items.Count; index++)
{
    MessageBox.Show(listBox1.Items[index].ToString();
}

或

foreach (DataRowView item in listBox1.Items)
{
   MessageBox.Show(item.Row["ID"].ToString() + " | " + item.Row["bus"].ToString());
}

虽然这些方法对选定的项目很有效,但我还没有弄清楚或找到的是如何获取列表框中每个项目的选定状态、选定和未选定,因为上面只给出了选定的. 基本上,我需要这样的东西;

for(int index=0;index < listBox1.Items.Count; index++)
{
    if (index.SelectedMode == SelectedMode.Selected)
    {
        MessageBox.Show(listBox1.Items[index].ToString() +"= Selected";
    }
    else
    {
        MessageBox.Show(listBox1.Items[index].ToString() +"= Unselected";
    }
}

我找到了一个 sn-p,它说使用 (listBox1.SelectedIndex = -1) 来确定选定的状态,但是我还没有想出或找到如何围绕它建立一个循环来检查每个项目列表框。

我还读到我应该将列表框项目放入一个数组中,但同样没有关于获取列表框中每个项目的选定状态。

我知道我必须遍历列表框来完成我需要的事情,很确定它会是上述循环之一,但是我还没有找到如何提取每个项目的选定状态列表框。

我正在使用 VS2013、C# Windows 窗体、.NET Framework 4.0 提前感谢您的任何建议/指导。

【问题讨论】:

    标签: c# winforms listbox selecteditem


    【解决方案1】:

    这将为您提供未选择的项目:

    List<string> unselected = listBox1.Items.Cast<string>().Except(listBox1.SelectedItems.Cast<string>());
    

    您可以像这样遍历该列表:

    foreach(string str in listBox1.Items.Cast<string>().Except(listBox1.SelectedItems.Cast<string>()))
    {
        System.Diagnostics.Debug.WriteLine($"{str} = Not selected");
    }
    

    我假设您使用string 作为您的项目类型。如果您想使用其他内容,只需将 string 替换为您的类型,它应该仍然有效。

    然后您循环遍历未选中的项目以对它们执行任何您想要的操作,然后遍历listBox1.SelectedItems 对选定的项执行您想要执行的任何操作。

    【讨论】:

    • 这看起来是一个有趣的方法,我会仔细研究一下。谢谢你的回答。
    • @Reza Aghaei 你能解释一下为什么它不正确吗?我错过了我添加的 WriteLine 中的 $,但我没有发现它有任何其他问题 - 我已经测试了这段代码并且它可以工作。
    • 项目可以是任何东西,例如在问题中,项目是DataRowView。要从项目中获取文本,您应该使用ListBox 的GetItemText 方法。例如,要获取所有项目的文本,您可以使用listBox1.Items.Cast&lt;object&gt;().Select(x=&gt;listBox1.GetItemText(x))。
    • 正如我在回答中所说,我假设了一个字符串,但表示可以将其切换为不同的类型。将演员阵容从 &lt;string&gt; 更改为 &lt;DataRowView&gt; 仍然可以正常工作 - 唯一的其他更改是需要更新 {str} 以包含 DataRowView 的文本属性。我的回答还是正确的。
    • 在仔细查看和比较两个答案后,这为我提供了有关控件的更多信息。
    【解决方案2】:

    您可以使用ListBox 的GetSelected 方法。它返回一个值,指示指定的项目是否被选中。

    例如,以下代码,如果选择了索引 0 处的项目(第一项),则将 selected 的值设置为 true:

    var selected = listBox1.GetSelected(0);
    

    示例

    以下循环,为每个项目显示一个消息框,显示项目文本和项目选择状态:

    for (int i = 0; i < listBox1.Items.Count; i++)
    {
        var text = listBox1.GetItemText(listBox1.Items[i]);
        var selected = listBox1.GetSelected(i);
        MessageBox.Show(string.Format("{0}:{1}", text, selected ? "Selected" : "Not Selected"));
    }
    

    【讨论】:

    • 这个答案让我更加接近,并且确实识别了选中/未选中,但是如何将正在评估的项目的值合并为代码循环?
    • 我有字符串 itm = ""; for(int index = 0; index
    • 我在答案中添加了一个示例。
    • Reza Aghaei,您添加的示例正是我所需要的。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 2022-08-17
    • 2011-08-30
    相关资源
    最近更新 更多