参考单一功能范围内的现有控制

时间:2012-02-13 00:42:21

标签: c# winforms listbox sender

我可能会对术语感到困惑,但这就是我要做的事情:

我有一个移动功能,最终将所选项目从一个listBox移动到另一个sender。有三个列表框,每个列表框中有两个左右箭头按钮,用于将第一个列表框项目移动到中间,中间移动到第一个,等等。

我的功能通过switch接受不同的按钮名称,在listBox语句中,我想选择哪个listBoxes是要发送的所选项目以及它们将在何处发送寄去。如果这是有道理的。

底部的while循环将执行实际移动,具体取决于为“to”和“from”listBoxes设置的内容。

我的问题是,在switch语句的每个案例中,我如何在此函数的范围内引用现有的三个new listBox的名称?我知道初始化listBoxes就像我做的那样是错误的,只会创建更多while。也许对于这种情况,最简单的方法是在每个case语句中明确地放置private void move(object sender, EventArgs e) { Button thisButton = sender as Button; ListBox to = new ListBox(); ListBox from = new ListBox(); switch (thisButton.Name) { case "queueToProgressButton": to.Name = "queueListBox"; from.Name = "progressListBox"; break; case "progressToQueueButton": to.Name = "queueListBox"; from.Name = "progressListBox"; break; case "progressToCompletedButton": to.Name = "queueListBox"; from.Name = "progressListBox"; break; case "completedToProgressButton": to.Name = "queueListBox"; from.Name = "progressListBox"; break; } while (from.SelectedItems.Count > 0) { to.Items.Add(from.SelectedItem); from.Items.Remove(from.SelectedItem); } } 循环,但对于未来在更复杂的情况下,我仍然想知道如何完成。

{{1}}

1 个答案:

答案 0 :(得分:2)

您应该使用对现有列表框的引用,而不是分配新的列表框。此外,switch的四个分支在您发布的代码中是相同的;我不认为那是你的意图。我根据我在switch中想要做的事情对代码进行了调整。

尝试这样的事情:

private void move(object sender, EventArgs e)
{
    Button thisButton = sender as Button;
    ListBox toListBox, fromListBox;

    switch (thisButton.Name)
    {
        case "queueToProgressButton":
            toListBox = progressListBox; // notice no "", but actual references
            fromListBox = queueListBox;
            break;
        case "progressToQueueButton":                    
            toListBox = queueListBox;
            fromListBox = progressListBox;
            break;
        case "progressToCompletedButton":                    
            toListBox = completedListBox;
            fromListBox = progressListBox;
            break;
        case "completedToProgressButton":                    
            toListBox = completedListBox;
            fromListBox = progressListBox;
            break;
        // Should add a default just in case neither 
        // toListBox or fromListBox is assigned here.
    }

    while (fromListBox.SelectedItems.Count > 0)
    {
        toListBox.Items.Add(fromListBox.SelectedItem);
        fromListBox.Items.Remove(fromListBox.SelectedItem);
    }
}