2009-06-30 2 views
2

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

Любые лучшие практики здесь?

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

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

+0

Эта статья мне полезна: [Установка AcceptButton для UserControl] (http://samgaut.blogspot.de/2008/04/winform-default-button-pressed.html) – algreat

ответ

2

Ян Миксовский имеет отличный блог по дизайну пользовательского интерфейса и написал an article about this very thing.

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

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

4

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

1

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

Если это так, вы можете запереть события кнопки в родительской форме. Если вы открываете отдельные кнопки через свойство, вы можете привязать их к событиям 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») при загрузке имеет mthod, которая связывает в замковых события каждой кнопки, но он вызывает тот же метод. Внутри метода я проверяю свойство «Имя».

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, заставить их открывать свои кнопки, тогда вы можете делать все, что хотите, со свойствами и событиями из тех Кнопки (или любой контроль в этом отношении).

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

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

+0

Каждая кнопка представляет собой отдельный экземпляр yes. Однако моя задача заключалась только в том, чтобы установить aproperiate-кнопку как AcceptButton всякий раз, когда новый пользовательский контроль получает фокус, а не для того, чтобы поймать события. Но, может быть, я неправильно понял ваш ответ. Спасибо в любом случае :) – Ezombort

1

Я знаю, что это старый пост, но я думаю, что понял.

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

+0

Вы пробовали этот метод с успехом? –

Смежные вопросы