使用selectedvaluechanged的C#列表框

时间:2017-05-28 22:05:22

标签: c# winforms

我经常把事情搞清楚,但这让我受伤了。

我在表单和提交按钮上有一系列列表框。用户可以从任何列表框中选择项目然后单击提交按钮以选择确认项目,但需要发生的是,如果他们从列表框1中选择了某些内容,则更改他们的想法并从列表框2中选择一些项目,在列表框中选择该项目1应该不被选中。

我可以将其编码到事件处理程序中,但问题是我一改为另一个列表框中的值,就会以编程方式触发另一个事件。我似乎无法逻辑地走出它。

任何想法都会很棒,否则我想我只需要放置多个提交按钮。

编辑:

我想到了我认为最终是一个非常明显而简单的解决方案。我利用focus属性来区分用户或程序是否正在进行更改。适用于鼠标和键盘选择。

感谢您的建议......

 for (int i = 0; i < treatments.Length; i = i + 1)
        {
            this.Controls.Add(ListBoxes[i]);
            this.Controls.Add(Labels[i]);
            this.Controls.Add(Spinners[i]);

            Labels[i].Top = vPosition - 20;
            Labels[i].Left = hPosition;
            Labels[i].Width = 600;

            ListBoxes[i].Left = hPosition;
            ListBoxes[i].Top = vPosition;
            ListBoxes[i].Width = 600;

            Spinners[i].Top = vPosition + ListBoxes[i].Height;
            Spinners[i].Left = hPosition + ListBoxes[i].Width - 60;
            Spinners[i].Width = 40;
            for (int d = 25; d > 0; d = d - 1) { Spinners[i].Items.Add((d).ToString()); }
            Spinners[i].SelectedIndex = 24;



            //EVENT HANDLER CODE that is executed if any selectetindexchange in any LIstbox in array
            ListBoxes[i].SelectedIndexChanged   += (sender, e) =>
                {


                    for (int s = 0; s < i; s = s + 1)

                    {
                        //FIND WHICH LBs[s] IS THE SENDING LISTBOX 
                        if (ListBoxes[s] == sender && ListBoxes[s].Focused == true)
                        {
                            string msg = "sender is ListBox " + s.ToString() + "\nFocus is" + ListBoxes[s].Focused.ToString();
                           // MessageBox.Show(msg);
                        }
                        else if(ListBoxes[s].Focused==false)
                        {
                            ListBoxes[s].SelectedIndex = -1;
                        }                        


                    }


                }; //end of event handler

}

2 个答案:

答案 0 :(得分:0)

我通常用一个标志来解决这种问题,让我知道我正在改变事物,所以我的事件处理程序可以检查标志而不采取行动。

private int codeChangingCount = 0;
private void combobox1_SelectedIndexChanged(object sender, EventArgs e) {
    codeChangingCount++;
    try {
        combobox2.SelectedIndex = someNewValue;
    } finally {
        codeChangingCount--;
    }
}

private void combobox2_SelectedIndexChanged(object sender, EventArgs e) {
    if (codeChangingCount == 0) {
        //I know this is changing because of the user did something, not my code above
    }
}

您可以使用简单的bool代替int执行此操作,但我喜欢计数器方法,以便我可以在嵌套调用中继续递增codeChangingCount并且不会意外地重置它。在我的生产代码中,我有一个专门用于这种标记的类,它(错误)使用IDisposable递减,所以我可以将我的调用包装在using块中,但上面的代码片段更简单

答案 1 :(得分:0)

检查Focused ListBox == ListBox2和SelectedIndex&gt; -1然后取消选择Index [0]

l.forEach(::printIsEven)