1

我在 UI 中有几个组合框,每个组合框都有一长串相似的条目(数字)。当用户从一个组合框中选择一个项目时,我知道用户会从其他组合框中选择一个具有相似值(但可能不相同)的条目。因此,在用户选择了一个值后,为了避免强迫用户进行大量滚动,我想将下一个组合框下拉菜单“预滚动”到最后一个选择的值附近(当这个下拉菜单没有已经有选择)。

到目前为止,我已经通过使用

combobox.SelectedItem = myLastSelectedItem;

在 combobox.DropDown 事件处理程序中。

然后,当下拉菜单关闭时,我需要能够检测用户是否点击了下拉菜单中的项目。如果用户没有单击某个项目,那么我必须将所选值重置为之前的值(无)。用户可能单击了 myLastSelectedItem 或其他项目(因此,我不能只将当前选定的项目与 myLastSelectedItem 进行比较,因为即使用户确实单击了它们也可能相同)。SelectedValueChange、SelectedIndexChange、TextChanged 都在 DropDownClosed 事件之后被触发,因此我无法使用它们。MouseClick 事件根本不会被触发。

因此,我如何检测到用户点击了组合框下拉菜单中的项目(而不是因为用户点击了下拉菜单或按下了退出而关闭了下拉菜单)?

4

1 回答 1

0

我尽我最大的努力看看我是否能完成这项工作,但如果我在 30 分钟后不拔掉头发,我会被诅咒的。如果您愿意进行一些更改,您可以尝试使用 ListBox 控件。它有一个“TopIndex”属性,可以滚动到您想要的索引,但实际上从不进行选择。见下面的代码:

    private void listBox_SelectedIndexChanged(object sender, EventArgs e) {
        ListBox lbx = sender as ListBox;
        if (lbx != null) {
            switch (lbx.Name) {
                case "listBox1": 
                    listBox2.TopIndex = lbx.SelectedIndex; 
                    listBox2.SelectedIndex = -1; 
                    listBox3.TopIndex = 0; 
                    listBox4.TopIndex = 0; 
                    break;
                case "listBox2": 
                    listBox3.TopIndex = lbx.SelectedIndex; 
                    listBox3.SelectedIndex = -1;
                    listBox4.TopIndex = 0;
                    break;
                case "listBox3": 
                    listBox4.TopIndex = lbx.SelectedIndex; 
                    listBox4.SelectedIndex = -1; 
                    break;
            }
        }
    }

4 个不同的 ListBox 控件都在其 SelectedIndexChanged 事件中使用该控件。让我知道这是否有效。如果没有,我可以回到 ComboBoxes。

于 2012-09-28T18:39:54.423 回答