Как я могу обновить метку на одной форме из другой формы в C #? - PullRequest
0 голосов
/ 26 декабря 2010

Я хочу обновить метку Form1 с Form2. Итак, вот что у меня есть:

// Form1
public string Label1
{
    get { return this.label1.Text; }
    set { this.label1.Text = value; }
}


// Form2
private void button1_Click(object sender, EventArgs e)
{
    Form1 frm1 = new Form1();
    frm1.Label1 = this.textBox1.Text;
    this.Close();
}

Так что приведенный выше код не работает. Однако, когда я добавляю следующее:

frm1.Show();

после

this.Close();

в коде Form2 форма Form1 снова открывается (два окна). Но я хочу обновить его в том же окне, поэтому предлагаю this.Close() не нужно.

У кого-нибудь есть идеи?

Ответы [ 5 ]

6 голосов
/ 26 декабря 2010

В методе button1_Click вы фактически создаете новый экземпляр Form1 и устанавливаете свойство Label1 этого нового экземпляра.Это объясняет, почему при добавлении frm1.Show(); на экране отображается второй экземпляр Form1.Если вы внимательно посмотрите на эту вторую копию, то увидите, что ее метка отображает правильное значение, но ваша оригинальная копия этой формы сохраняет свое первоначальное значение.

Вместо этого я предполагаю, что вы хотите сделатьустановите свойство Label1 для существующего экземпляра Form1, который уже отображается на экране.Чтобы сделать это, вам нужно получить ссылку на этот существующий объект формы.

Таким образом, это становится простым вопросом о том, «как я передаю данные между двумя объектами (формами)»,который задавали бесчисленное количество раз здесь, на переполнение стека.См. Ответы на следующие вопросы:

1 голос
/ 26 декабря 2010

Попробуйте использовать шаблон проектирования Singleton для этого, так как я думаю, что проблема в том, что вы используете новый

public class Form1Singleton {

    private static final Form1Singleton INSTANCE = null; 
    // Private constructor prevents instantiation from other classes
    private Form1Singleton () {
    }

    public static Form1Singleton getInstance() 
    {
       if(INSTANCE ==null)
            INSTANCE =new Form1Singleton();

        return INSTANCE;
    }

}

Теперь вы можете легко использовать форму только 1 форму

private void button1_Click(object sender, EventArgs e) 
{     
Form1Singleton frm1 = Form1Singleton.getInstance();

frm1.Label1 = this.textBox1.Text;     
this.Close(); 
} 

Я надеюсь, что решить вашу проблему

BR

Мухаммед Табет Заки

0 голосов
/ 26 декабря 2010

Шаблон MVP подходит для этого типа senario, а также для отдельного пользовательского интерфейса и бизнес-логики.

Эта тема является хорошей ссылкой: Шаблон проектирования пользовательского интерфейса для Windows Forms (например, MVVM для WPF)

0 голосов
/ 26 декабря 2010

Когда вы говорите this.close, это означает, что все значения, установленные для этого экземпляра, обнуляются.

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

0 голосов
/ 26 декабря 2010

Скорее всего: то, что вы на самом деле делаете, - это создаете новый экземпляр Form1 в области действия Form2, тогда как позже в потоке управления вашей программой создается и отображается другой экземпляр Form1.Конечно, в таком случае вы не можете ожидать, что ваш ярлык будет установлен правильно.

Лучше всего было бы отделить Form1 и Form2 друг от друга и вместо этого передавать только данные по потоку управления вашей программы.

...