[英]Enabling/Disabling Moveup/MoveDown buttons on a ListView
具有这样的形式:
我编写这段代码是为了在单击项目时照顾上移/下移按钮的启用/禁用逻辑(我们不在乎左侧的“可用列表”,我们只在意右侧的“选定”列表)
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中时,我不希望启用它们。另外,如果您发现我粘贴的代码有任何问题,请告诉我。 谢谢
问题是,一旦单击“移动”按钮,那么您就位于SelectedListView控件之外,因此逻辑应该实际上基于是否具有正确的索引值:
private void SelectedLV_SelectedIndexChanged(object sender, EventArgs e)
if (SelectedLV.SelectedIndicies.Count == 0) {
MoveUpBtn.Enabled = false;
MoveDownBtn.Enabled = false;
} else {
// normal processing
}
您将着眼于聚焦要求。 此类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,这样焦点就不再重要了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.