winforms 如何防止组合框的SelectedIndex发生更改?

e5nqia27  于 2023-06-24  发布在  其他
关注(0)|答案(2)|浏览(106)

我正在寻找一个事件,我可以防止组合框的SelecteIndex属性被设置。也可能是一个名为“SelectedIndexChanging”的自创建事件。我需要它来阻止SelectedIndex改变,直到特定条件为真。
我试图寻找一个事件,我可以防止SelectedIndex的变化。我还尝试在我的CustomComboBox中实现一个事件来阻止这一点。这里没有成功。
先谢谢你了。

编辑当用户更改组合框时,我会查看该对象是否保存在数据库中,当没有,如果他想保存,如果他会屏蔽他(用MessageBox)。使用DialogResult,我想中断SelectedIndex的更改。

huwehgph

huwehgph1#

这是一个小技巧,因为SelectedIndex属性值实际上会改变,但如果SelectedIndexChanging事件被取消,它会再次改变,但从用户的Angular 来看,它肯定会工作。如果您正在使用SelectedValue,则可能需要检查它们的行为。

internal class ComboBoxEx : ComboBox
{
    private int previousSelectedIndex = -1;
    private bool isRevertingSelectedIndex = false;

    public event EventHandler<CancelEventArgs> SelectedIndexChanging;

    protected virtual void OnSelectedIndexChanging(CancelEventArgs e)
    {
        SelectedIndexChanging?.Invoke(this, e);
    }

    protected override void OnSelectedIndexChanged(EventArgs e)
    {
        if (isRevertingSelectedIndex)
        {
            isRevertingSelectedIndex = false;

            // Ignore the event altogether.
            return;
        }

        var cea = new CancelEventArgs();

        OnSelectedIndexChanging(cea);

        if (cea.Cancel)
        {
            // Revert the index to its previous value, so it appears not to have changed.
            isRevertingSelectedIndex = true;
            SelectedIndex = previousSelectedIndex;

            // Do not process the event any further.
            return;
        }

        // Commit the index change.
        previousSelectedIndex = SelectedIndex;

        base.OnSelectedIndexChanged(e);
    }
}

您只需处理SelectedIndexChanging事件,并将e.Cancel设置为true(如果SelectedIndex不应更改)。

pbwdgjma

pbwdgjma2#

另一个小黑客...创建一个字段(元组),您可以在其中跟踪最后选择的索引以及它是否可以更改...

(bool blockChanges, int atIndex) comboRestriction = (false, 0);

在SelectionChanged方法中添加以下内容:

ComboBox combo = (ComboBox)sender;

if (comboRestriction.blockChanges && combo.SelectedIndex != comboRestriction.atIndex)
{
     combo.SelectedIndex = comboRestriction.atIndex;
     return;
}
else if (comboRestriction.blockChanges)
{
      return;
 }

// Combo Changed - track last index
comboRestriction = (false, combo.SelectedIndex);
...

当你想“阻止”comboBox时,将其设置为“true”:

comboRestriction.blockChanges = true;

相关问题