C #, используя значение int после запуска события - PullRequest
0 голосов
/ 15 августа 2011

Я приходил к одному и тому же вопросу снова и снова.Мне нужно использовать введенные пользователем значения после события кнопки, или двойного щелчка, или чего-нибудь еще.когда я делаю это с дизайнером, он автоматически передает элемент управления txt и его значение всей программе, и я могу использовать его где угодно.Но программно я не мог решить это.Вот небольшой пример:

        private void Form1_Load(object sender, EventArgs e)
    {
        string blabla = "anything";

        Button btn = new Button();
        btn.Location = new Point(10, 40);
        btn.Text = "Click me";
        btn.Click += new EventHandler(btn_Click);
        this.Controls.Add(btn);

    }
    void btn_Click(object sender, EventArgs e)
    {
        MessageBox.Show(blabla);
    }

это не работает, поэтому я добавил "public", и скрипт выглядит так:

    public string blabla;
    private void Form1_Load(object sender, EventArgs e)
    {
        blabla = "anything";

        Button btn = new Button();
        btn.Location = new Point(10, 40);
        btn.Text = "Click me";
        btn.Click += new EventHandler(btn_Click);
        this.Controls.Add(btn);

    }
    void btn_Click(object sender, EventArgs e)
    {
        MessageBox.Show(blabla);
    }

И поэтому я могу использовать свою переменную сизменились значения.Это хорошо сочетается и с контролем.Это работает, но это делает тысячи общедоступных переменных в большем приложении.Как я могу улучшить читаемость, потеряв эти публичные?Есть ли способ использовать «ref»?Я видел это на автоматическом «методе извлечения», я просто не знаю, как я могу использовать это с событиями.

Возможно, я нахожусь на неправильном пути в этом, если есть ярлык или другое решениеПожалуйста, помогите.

Ответы [ 4 ]

4 голосов
/ 15 августа 2011

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

Однако другой альтернативой является сохранение ее в качестве локальной переменной, но использование анонимной функции для обработки события:

private void Form1_Load(object sender, EventArgs e)
{
    string blabla = "anything";

    Button btn = new Button();
    btn.Location = new Point(10, 40);
    btn.Text = "Click me";
    btn.Click += (sender, args) => {
        MessageBox.Show(blabla);
        // Other code here, but hopefully not too much...
    };
    this.Controls.Add(btn);
}

(Как уже отмечалось, вы не хотите делать анонимную функцию слишком большой для удобства чтения, но она всегда может вызвать другой метод со всем соответствующим состоянием.)

РЕДАКТИРОВАТЬ: Поскольку вы используете VS2005, вы используете только C # 2, поэтому вы не можете использовать лямбда-выражения. Вы можете использовать анонимные методы, хотя. Код будет тогда:

private void Form1_Load(object sender, EventArgs e)
{
    string blabla = "anything";

    Button btn = new Button();
    btn.Location = new Point(10, 40);
    btn.Text = "Click me";
    btn.Click += delegate {
        MessageBox.Show(blabla);
        // Other code here, but hopefully not too much...
    };
    this.Controls.Add(btn);
}
2 голосов
/ 15 августа 2011

Все элементы управления winforms имеют тенденцию иметь свойство Tag типа object, которое вы можете использовать для хранения своих собственных пользовательских данных, если хотите. Это не особенно хорошая практика, и выявляются некоторые другие архитектурные проблемы, но здесь вы идете:

private void Form1_Load(object sender, EventArgs e)
{

    Button btn = new Button();
    btn.Location = new Point(10, 40);
    btn.Text = "Click me";
    btn.Click += new EventHandler(btn_Click);
    btn.Tag = "blahblah";
    this.Controls.Add(btn);

}
void btn_Click(object sender, EventArgs e)
{
    Button btn = (Button)sender;
    MessageBox.Show(btn.Tag.ToString());
}
0 голосов
/ 15 августа 2011

Вы можете сделать это, сделав замыкание внутри метода Form1_Load следующим образом

private void Form1_Load(object sender, EventArgs e)
{
    blabla = "anything";

    Button btn = new Button();
    btn.Location = new Point(10, 40);
    btn.Text = "Click me";
    btn.Click += (s,e) => MessageBox.Show(blabla);
    this.Controls.Add(btn);

}

Даже если blabla выйдет из области видимости, замыкание все равно будет знать, что оно содержит текст «что угодно», когдаВы нажимаете кнопку.

0 голосов
/ 15 августа 2011

Вы можете сделать это с лямбдами.

btn.Click += (sender, e) => { MessageBox.Show(blabla); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...