0

用这样的形式:

我编写了这段代码来处理上移/下移按钮单击项目时的启用/禁用逻辑(我们不关心左侧的可用列表,我们只关心右侧的选定列表)

在此处输入图像描述

   private void SelectedLV_SelectedIndexChanged(object sender, EventArgs e)
    {
        // what to do wth move up button
        if (SelectedLV.SelectedIndices.Count == 1 && SelectedLV.SelectedItems[0].Index > 0)
        {
            MoveUpBtn.Enabled = true;
        }
        else
        {
            MoveUpBtn.Enabled = false;
        }

        //what to do with move down button
        if (SelectedLV.SelectedIndices.Count == 1 && SelectedLV.SelectedItems[0].Index < SelectedLV.Items.Count - 1)
        {
            MoveDownBtn.Enabled = true;
        }
        else
        {
            MoveDownBtn.Enabled = false;
        }
    }

我认为它适用于那种情况,但我的问题是,当我们单击选定的列表视图时,处理该情况并禁用两个上移/下移按钮的好逻辑是什么? 当我们不在 SelectedListView 内时,我不希望它们被启用...另外,如果您发现我粘贴的代码有任何问题,请告诉我。谢谢

4

2 回答 2

2

问题是,一旦您单击“移动”按钮,您就处于 SelectedListView 控件之外,因此逻辑实际上应该基于您是否具有正确的索引值:

private void SelectedLV_SelectedIndexChanged(object sender, EventArgs e)
  if (SelectedLV.SelectedIndicies.Count == 0) {
    MoveUpBtn.Enabled = false;
    MoveDownBtn.Enabled = false;
  } else {
    // normal processing
  }
于 2012-05-28T17:14:32.943 回答
2

你即将用焦点要求拍摄你的脚。此类 UI 更新最好使用 Application.Idle 事件完成,它仅在没有重要事件发生时运行。并且可以帮助消除很多事件处理程序。像这样:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        Application.Idle += Application_Idle;
        this.FormClosed += delegate { Application.Idle -= Application_Idle; };
    }

    void Application_Idle(object sender, EventArgs e) {
        bool focusOk = this.ActiveControl == SelectedLV;
        bool selectOk = SelectedLV.SelectedIndices.Count == 1;
        int index = selectOk ? SelectedLV.SelectedIndices[0] : -1;
        MoveUpBtn.Enabled = focusOk && selectOk && index > 0;
        MoveDownBtn.Enabled = focusOk && selectOk && index < SelectedLV.Items.Count-1;
    }
}

不要忘记在按钮的 Click 事件处理程序中重新设置焦点。不要忘记 ListView.HideSelection 属性。将其设置为 False,这样焦点就不再重要了。

于 2012-05-28T17:41:51.060 回答