.NET UserControl принять кнопку лучшие практики? - PullRequest
2 голосов
/ 30 июня 2009

У меня есть приложение для форм Windows, где я разделил различные функции на несколько пользовательских элементов управления. Я хочу, чтобы у каждого из этих пользовательских элементов управления была кнопка подтверждения.

Есть ли здесь лучшие практики?

Моя идея - определить, какой пользовательский элемент управления имеет фокус, и установить его в родительской форме.

Любые другие идеи?

Ответы [ 5 ]

4 голосов
/ 30 июня 2009

Лучшая практика, как правило, - иметь только одну кнопку подтверждения для вашей формы, чтобы ее поведение было согласованным. Как правило, пользователям было бы непонятно, если нажатие клавиши return вызывает разные действия в зависимости от того, на какой раздел формы был нацелен. Однако если у вас есть специализированное приложение или пользователи запросили эту функцию, то я думаю, что предложенное вами решение будет работать.

2 голосов
/ 30 июня 2009

Ян Миксовский имеет отличный блог по дизайну пользовательского интерфейса и написал статью об этой самой вещи .

Большинство платформ пользовательского интерфейса позволяют дизайнеру указать, какая кнопка в диалоге должна быть кнопкой по умолчанию: кнопка, которая будет нажата, если пользователь вводит клавишу ввода. По умолчанию Кнопка, как правило, кнопка пользователь, скорее всего, нажмет следующее, часто кнопка, как ОК, которая закрывает Диалог. В диалогах с очень большим трафиком, Вы можете рассмотреть динамически изменение кнопки по умолчанию для сохранения нажатия клавиш и помогают ускорить пользователя задача.

В качестве примера он использует диалоговое окно «Выбор имен» в Microsoft Outlook, в котором кнопка по умолчанию изменяется в зависимости от того, что вы делаете.

1 голос
/ 24 мая 2011

Я знаю, что это старый пост, но, кажется, я понял это.

Используйте событие «Ввод» на каждом пользовательском элементе управления из главной формы, чтобы, когда пользователь «вводит» (фокусируется на) элемент управления, this.AcceptButton = myUserControlButton. Вы также можете использовать событие «Выйти» на каждом пользовательском элементе управления, чтобы установить кнопку принятия обратно на значение по умолчанию, если оно у вас есть.

1 голос
/ 30 июня 2009

Я предполагаю, что каждая пользовательская кнопка является своим собственным экземпляром на отдельных пользовательских элементах управления?

Если это так, то вы можете перехватывать события кнопки в родительской форме. Если вы открываете отдельные кнопки через свойство, вы можете связать их с событиями Click. Как и все элементы управления, они имеют свойство name, поэтому у вас может быть один метод, который вызывается для всех событий нажатия кнопки.

Ниже у меня есть частичный пример кода. У меня есть два пользовательских элемента управления, которые имеют одну кнопку каждый. Кнопка на UC1 называется «btn1» и «btn2» для UC2. Я называю выставленное свойство "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 каждой кнопки, но вызывает тот же метод. Внутри метода, который я тестирую для свойства «Имя».

    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());
            }
        }
    }

Вы также можете использовать свойство тега элемента управления. Это свойство может быть очень полезным, поскольку оно может ссылаться на объекты.

Вам не нужно делать точно так, как показано, но вы можете использовать любую «Родительскую» форму, чтобы получить ссылку на UserControls, заставить их выставлять свои кнопки, а затем вы можете делать все что угодно со свойствами и событиями из этих кнопок. (или любой контроль в этом отношении).

Имейте в виду, что если вы подключаетесь к событию click на пользовательском элементе управления (в дополнение к родительской форме), вам нужно помнить о порядке, в котором он перечисляет список делегатов и выполняет их. код после начала события.

Надеюсь, это поможет.

0 голосов
/ 10 июня 2018

Возможно, не лучшая практика (но похожая на метод выше), я обычно делаю это так:

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 вне класса формы, выставив их.

...