.NET UserControl接受按钮最佳实践?

时间:2009-06-30 12:11:58

标签: c# .net winforms user-controls acceptbutton

我有一个Windows窗体应用程序,我将不同的功能分成几个用户控件。我希望每个用户控件都有一个接受按钮。

这里有哪些最佳做法?

我的idèa是检测哪个用户控件具有焦点,而不是在父窗体中设置它。

还有其他的idèas吗?

6 个答案:

答案 0 :(得分:4)

最佳做法通常是只为表单设置一个接受按钮,以使其行为一致。如果击中返回导致不同的操作取决于表单的哪个部分具有焦点,则通常会使用户感到困惑。但是,如果您有专门的应用程序或用户已请求此功能,那么我认为您建议的解决方案将起作用。

答案 1 :(得分:2)

Jan Miksovsky有一篇关于UI设计的优秀博客,并写了an article about this very thing

  

大多数UI平台允许设计师使用   指示对话框中的哪个按钮   应该是默认按钮:   如果按下将被按下的按钮   用户键入Enter键。默认   按钮一般是按钮   用户最有可能按下,   通常是一个像OK一样关闭的按钮   对话。在非常高流量的对话中,   你可能想动态考虑   更改默认按钮以保存   击键和帮助加快用户的速度   任务。

他使用的示例是Microsoft Outlook中的“选择名称”对话框,它根据您的操作更改默认按钮。

答案 2 :(得分:1)

我假设每个用户按钮在各个用户控件上都是它自己的实例?

如果是,那么您可以在父表单上捕获按钮事件。如果您通过属性公开各个按钮,则可以将其与Click事件绑定。与所有控件一样,它们具有name属性,因此您可以在所有按钮单击事件上调用一个方法。

下面我有一个部分示例代码。我有两个用户控件,每个控件都有一个按钮。 UC1上的按钮被命名为“btn1”,UC2被命名为“btn2”。我将暴露的属性称为“ButtonOK”

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
    }

    public Button ButtonOK
    {
        get { return btn1; }
    }
}

public partial class UserControl2 : UserControl
{
    public UserControl2()
    {
        InitializeComponent();
    }

    public Button ButtonOK
    {
        get { return btn2; }
    }
}

现在在父级(“Form1”)上加载时有一个与每个按钮的Click事件相关联的方法,但它调用相同的方法。在方法内部,我测试了“Name”属性。

    public Form1()
    {
        InitializeComponent();
    }

    void Form1_Load(object sender, EventArgs e)
    {
        RegisterButtonEvents();
    }

    void RegisterButtonEvents()
    {
        userControl11.ButtonOK.Click += new EventHandler(ButtonOK_Click);
        userControl21.ButtonOK.Click += new EventHandler(ButtonOK_Click);
    }

    void ButtonOK_Click(object sender, EventArgs e)
    {
        Button btn = sender as Button;
        if (btn != null)
        {
            if (btn.Name == "btn1")
            {
                Console.WriteLine(" ButtonOK from UserControl1 was pushed. The tag is " + btn.Tag.ToString());
            }
            else if (btn.Name == "btn2")
            {
                Console.WriteLine(" ButtonOK from UserControl2 was pushed. The tag is " + btn.Tag.ToString());
            }
        }
    }

您还可以使用控件的“Tag”属性。此属性非常有用,因为它可以引用对象。

您不需要完全按照显示的方式执行,但您可以使用任何“父”表单来获取对UserControls的引用,让它们公开它们的按钮,然后您可以使用这些按钮中的属性和事件执行任何操作(或对此事的任何控制)。

请记住,如果您也在使用用户控件上的click事件(除了父窗体)之外,您还必须注意它将通过它列出的委托列表并执行它的顺序事件发生后的代码。

希望有所帮助。

答案 3 :(得分:1)

我知道这是一个老帖子,但我想我已经明白了。

在主窗体的每个用户控件上使用“Enter”事件,以便当用户“输入”(关注)用户控件this.AcceptButton = myUserControlButton时。您还可以在每个用户控件上使用“Leave”事件,将“接受”按钮设置为默认值(如果有)。

答案 4 :(得分:0)

也许不是最好的做法(但与上述方法类似)我通常这样做:

private void ButtonClick(object sender, EventArgs e)
{
 Button btn = (Button)sender;

swithch(btn.Name)
{
case "button1": /* Do Something Here */ break;
case "button2": /* Do Something Here */ break;
// etc
}
}

此外;如果需要(如上所述),总是可以通过公开方式在表单类之外检索Button。

答案 5 :(得分:0)

我不确定我是否正确理解了您的问题。 如果要将一个事件分配给几个按钮:

为此,您可以例如: -获取Button_Click事件上的按钮名称。 -列举姓名 -遍历控件。


以下示例: “如何从Button_Click事件获取按钮名称”。

// First; dont forget to assign the "Button_Click" event to your Button(s).

private void Button_Click(object sender, EventArgs e)
{
    // The line bellow assigns to "btn" variable the currently clicked button.
    Button btn = (Button)sender;

    // Then using a switch block; you can compare the button name and
    // perform the action desired for the clicked button.
    switch(btn.Name)
    {
        case "buttonName1": /* Do Something Here */ break;
        case "buttonName2": /* Do Something Here */ break;
        // etc
    }
 }

另外;如果您需要;始终可以通过暴露它们来在表单类外部检索Button。