【问题标题】:Disabling buttons problem on C#在 C# 上禁用按钮问题
【发布时间】:2010-02-17 15:48:18
【问题描述】:

好的,所以我正在尝试使用多个按钮将项目从一个列表框移动到另一个列表框,即

我有 2 个按钮 cmdRight 和 cmdRight2 在表单加载时都被禁用

如果用户在第一个列表框中选择单个项目,则启用 cmdRIght 按钮但仍禁用 cmdRight2,如果用户在第一个列表框中选择多个项目,则启用 cmdRight2 按钮但禁用 cmdRight。

我有移动按钮可以工作,但我遇到的问题是在使用 cmdRight2 按钮移动多个项目后,cmdRight 按钮启用(它不应该只在选择列表框中的单个项目后启用)。我已经尝试了许多 if 语句等,但它仍然会发生。

我是 C# 新手,因此我们将不胜感激。

谢谢

        private void lbList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.lbList1.SelectedItems != null)
            {
                cmdRight.Enabled = true; //enable cmdRight
                cmdClear.Enabled = true; //enable cmdClear
                if (this.lbList1.SelectedItems.Count > 1)//if multiple items selected
                {
                    cmdRight.Enabled = false;
                    cmdRight2.Enabled = true; //enable cmdRight2              
                }
            }
        }


    private void cmdRight2_Click(object sender, EventArgs e)
    {
        foreach (int i in lbList1.SelectedIndices)
        {
            lbList2.Items.Add(lbList1.Items[i].ToString());
        }
        while (lbList1.SelectedItems.Count > 0)
        {
            lbList1.Items.Remove(lbList1.SelectedItems[0]);
        }
        cmdRight2.Enabled = false;

    }

    private void cmdRight_Click(object sender, EventArgs e)
    {
        lbList2.Items.Add(lbList1.SelectedItem); //Add selected item from list1 to list2
        lbList1.Items.Remove(lbList1.SelectedItem);//remove the selected item in list1

        cmdRight.Enabled = false; //disable cmdRight
    }

【问题讨论】:

  • 您是否在每个函数的开头放置断点以查看它们被调用的顺序?或者至少,每次将 cmdRight.Enabled 设置为 true 时都会有一个断点。
  • 这不是您问题的答案,但为什么不将两个按钮组合起来(通过简单地消除 cmdRight 并保留 cmdRight2)?显然我不知道你的设计,但它可能会解决你的问题。
  • 我尝试了断点,由于某种原因,if 语句“if (this.lbList1.SelectedItems != null)”似乎总是正确的。即使没有选择任何内容
  • Matthew:唯一的问题是它是我的任务的一部分,我必须保持设计相同,有 2 个按钮 :-(

标签: c# listbox button


【解决方案1】:

如何创建一种方法EnableButtons,根据给定的标准启用/禁用按钮,例如“仅当...为真时启用 cmdRight2”。

然后,只要某些条件可能发生变化,就调用该方法。与您现在执行此操作的方式相比,这样做的优势在于方法中的标准是“绝对的”(因为按钮是一次性启用或禁用的)而不是“相对的”(当用户启用按钮时)做这个或那个)。

您也可以从Application.Idle 事件中调用此方法,而不是调用它来响应某些用户操作。

编辑

声明如下方法:

private void EnableButtons()
{
    controlX.Enabled = (<condition...>);
    controlY.Enabled = (<condition...>);
}

您可以从代码中按钮的启用状态应该更改的位置调用该方法,也可以在表单的构造函数中执行以下操作:

public Form1()
{
    // Other code...

    Application.Idle += new <The respective event handler>;
}

然后,为事件声明一个带有相应签名的方法并在那里调用EnableButtons。此方法将在您的应用程序“空闲”(等待用户操作)的情况下调用。

【讨论】:

  • 我对编程很陌生,所以我不知道该怎么做... :-S
  • 好建议。不过,他仍然需要修复启用/禁用逻辑。
  • @KP:我用一些伪代码编辑了我的回复。你会很容易明白我的意思——我现在脑子里没有正确的语法。
【解决方案2】:

我想你想要

if (this.lbList1.SelectedItems.Count == 1)
{
}
else if(this.lbList1.SelectedItems.Count > 1)
{
}
else
{
}

而不是

if (this.lbList1.SelectedItems != null)

然后您可以将所有这些放在一个名为“EnableButtons”的方法中,如其他地方所述

【讨论】:

  • 耶!!!这工作非常感谢你!接下来我会研究做方法。太感谢了!从昨晚开始就一直在尝试这样做。
  • 当您解决问题时,您会看到 SelectedItems 永远不会为空,您需要找到另一个开关(在这种情况下,选择的项目数)
【解决方案3】:

问题是您正在逐一删除项目,因此当只剩下一项时,您实际上选择了一项,因此您的程序启用了 cmdRight。解决这个问题的最简单方法是拥有

cmdRight2.Enabled = false;
cmdRight.Enabled = false;

在 cmdRight2_Click 方法的末尾。

【讨论】:

    猜你喜欢
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多