Получить возвращаемое значение от нажатой кнопки - PullRequest
2 голосов
/ 25 января 2011

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

Как я могу это сделать?И как мне узнать, какая кнопка была нажата?В этот момент код возвращает DialogResult, но я хочу вернуть значение Tag из функции.Как мне изменить мой код, чтобы он мог это сделать?

public static DialogResult SelectBox(string title, string[] btnArray, string[] btnValueArray)
{
    Form form = new Form();

    Button[] buttonArray;
    buttonArray = new Button[5];

    form.Text = title;

    for (int i = 0; i < btnArray.Length; i++)
    {
        buttonArray[i] = new Button();
        buttonArray[i].Text = btnArray[i];
        buttonArray[i].Tag = new int();
        buttonArray[i].Tag = btnValueArray[i];

        buttonArray[i].TabStop = false;
        buttonArray[i].Location = new System.Drawing.Point(0, i * 40);
        buttonArray[i].Size = new System.Drawing.Size(240, 40);
    }

    form.ClientSize = new Size(240, 268);
    form.Controls.AddRange(new Control[] { buttonArray[0], buttonArray[1], buttonArray[2] });
    form.FormBorderStyle = FormBorderStyle.FixedDialog;
    form.StartPosition = FormStartPosition.CenterScreen;
    form.MinimizeBox = false;
    form.MaximizeBox = false;

    DialogResult dialogResult = form.ShowDialog();
    return dialogResult;
}

Ответы [ 4 ]

7 голосов
/ 25 января 2011

Добавить приватную переменную в виде:

private object SelectedTag;

Добавить обработчик нажатия кнопки:

private void Button_Click(object sender, EventArgs e) {
    SelectedTag = ((Button)sender).Tag;
}

Назначьте обработчик каждой создаваемой кнопке:

..
buttonArray[i].OnClick += form.Button_Click;
..

Затем в вашей статической функции просто верните form.SelectedTag вместо результата диалога.

2 голосов
/ 25 января 2011

Вы можете вызвать одно и то же событие нажатия для всех кнопок. тогда в вашем обработчике:

private void ButtonClick(object sender, EventArgs args)
{
  Button oButton = (Button) sender;

  object data = oButton.Tag;
}
0 голосов
/ 25 января 2011

Вы можете добавить обработчик события ButtonClick в TestForm, установить тег кнопки на тег формы. Вот образец.

Основная форма:

        private void Form1_Load(object sender, EventArgs e)
        {
            Object tag;
            SelectBox("test", new String[] { "One", "Two", "Three" }, new String[] {"one value", "Two value", "three value" }, out tag);
            MessageBox.Show(tag.ToString());
        }

        public static DialogResult SelectBox(string title, string[] btnArray, string[] btnValueArray, out Object tagValue)
        {
            TestForm form = new TestForm();

            Button[] buttonArray;
            buttonArray = new Button[5];

            form.Text = title;

            for (int i = 0; i < btnArray.Length; i++)
            {
                buttonArray[i] = new Button();
                buttonArray[i].Text = btnArray[i];
                buttonArray[i].Tag = new int();
                buttonArray[i].Tag = btnValueArray[i];

                buttonArray[i].TabStop = false;
                buttonArray[i].Location = new System.Drawing.Point(0, i * 40);
                buttonArray[i].Size = new System.Drawing.Size(240, 40);
                // subscribe to button click event..
                // the handler is in TestForm
                buttonArray[i].Click += form.HandleOnButtonClick;
            }

            form.ClientSize = new Size(240, 268);
            form.Controls.AddRange(new Control[] { buttonArray[0], buttonArray[1], buttonArray[2] });
            form.FormBorderStyle = FormBorderStyle.FixedDialog;
            form.StartPosition = FormStartPosition.CenterScreen;
            form.MinimizeBox = false;
            form.MaximizeBox = false;

            DialogResult dialogResult = form.ShowDialog();
            // set the out args value
            tagValue = form.Tag;

            return dialogResult;
        }

TestForm, экземпляр которого мы создаем в диалоге SelectBox:

public partial class TestForm : Form
    {
        public TestForm()
        {
            InitializeComponent();
        }      

        public void HandleOnButtonClick(Object sender, EventArgs e)
        {
            Button button = sender as Button;

            if (button != null)
                this.Tag = button.Tag;
        }
    }

Edit:

Если вы хотите зафиксировать значение каждой кнопки, тогда выставьте свойство Dictionary<String, Object> Tags.

0 голосов
/ 25 января 2011

Свойство DialogResult уже сообщает вам, какая кнопка была нажата. Вы можете настроить каждую отдельную кнопку так, чтобы она возвращала разные значения DialogResult, а затем проверить это в нижней части функции.

И если вы хотите вместо этого вернуть свойство Tag нажатой кнопки, вам нужно изменить возвращаемое значение функции на Object (поскольку свойство Tag имеет тип Object).

...