使用如下形式:
我编写了这段代码,用于在点击项目时关注上/下按钮的启用/禁用逻辑(我们不关心左侧的可用列表,我们只关心右侧的选择列表)
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中时,我不希望它们被启用... 此外,如果您发现我粘贴的代码有任何问题,请告诉我。 感谢
答案 0 :(得分:2)
问题是一旦你单击Move按钮,那么你就在Selected ListView控件之外了,所以如果你有一个正确的索引值,逻辑应该真正基于:
private void SelectedLV_SelectedIndexChanged(object sender, EventArgs e)
if (SelectedLV.SelectedIndicies.Count == 0) {
MoveUpBtn.Enabled = false;
MoveDownBtn.Enabled = false;
} else {
// normal processing
}
答案 1 :(得分: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,以便焦点不再重要。