Как обновить текстовое поле в form1 из form2? - PullRequest
0 голосов
/ 01 ноября 2011

У меня есть 2 Windows Forms.

Во-первых, главное окно формы, имеет многострочное текстовое поле и кнопку. Кнопка открывает вторую форму, в которой я могу добавить данные в массив с помощью объекта AddEntry.

Во второй форме у меня есть текстовые поля и кнопка (btnAddEntry), которая должна обновить содержимое текстового поля с первой формы.

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

Проблема в том, что код, который я придумал, не работает.

Как бы я решил это?

Ответы [ 3 ]

3 голосов
/ 01 ноября 2011

Чтобы заставить работать БЕЙСИК, сделайте следующее. Создайте новый проект. Ничего из вашего текущего кода, окон и т. Д. Проект по умолчанию создаст форму "Form1", пока оставьте ее в покое.

Добавьте в проект НОВУЮ форму, по умолчанию она будет "Form2" ... Поместите на нее одно текстовое поле и одну кнопку. Для осмысления и уточнения различий между именами объектов измените имя элементов управления в Form2 на «txtOnForm2» и «btnOnForm2» (чувствителен к регистру для моего образца и читаемость по сравнению с «txtonform2» для всех строчных букв). Теперь в форме щелкните правой кнопкой мыши и выберите «Просмотр кода». Это приведет вас к другому объявлению «Частичный класс», где находятся ваши конструкторы. Добавьте следующее, не беспокойтесь об ошибках компиляции, так как другая половина будет, когда мы поместим код в Form1 next ...

// specifically typecasting the TYPE of form being passed in, 
// not just a generic form.  We need to see the exposed elements
Form1 CalledFrom;
// Ensure to do the : this() to make sure default behavior
// to initialize the controls on the form are created too.
public Form2(Form1 viaParameter) : this()
{
  CalledFrom = viaParameter;
}

private void btnOnForm2_Click(object sender, EventArgs e)
{
  CalledFrom.ValuesByProperty = this.txtOnForm2.Text;
  MessageBox.Show( "Check form 1 textbox" );

  string GettingBack = CalledFrom.ValuesByProperty;
  MessageBox.Show( GettingBack );

  CalledFrom.SetViaMethod( "forced value, not from textbox" );
  MessageBox.Show( "Check form 1 textbox" );

  GettingBack = CalledFrom.GetViaMethod();
  MessageBox.Show( GettingBack );
}

Сохраните и закройте окно конструктора и кода Form2.

Теперь откройте Form1. Поместите одно текстовое поле и одну кнопку на нем. Имена по умолчанию для элементов управления будут «textbox1» и «button1» соответственно. Оставь как есть. Дважды щелкните по кнопке (на форме 1). Это вызовет фрагмент кода для этой кнопки. Вставьте следующее

private void button1_Click(object sender, EventArgs e)
{
   Form2 oFrm = new Form2(this);
   oFrm.Show();
}

public string ValuesByProperty
{
  get { return this.textBox1.Text; }
  set { this.textBox1.Text = value; }
}

public void SetViaMethod(string newValue)
{ this.textBox1.Text = newValue; }

public string GetViaMethod()
{ return this.textBox1.Text; }

Теперь сохраните формы и запустите их. Нажмите кнопку в первой форме, вызывает вторую с уже созданным экземпляром, а не с новым экземпляром SECOND. Вторая форма будет отображаться. Сдвиньте окна, чтобы вы могли видеть оба.

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

1 голос
/ 01 ноября 2011

Ваша проблема в том, что MainWindow mainWindow = new MainWindow () создает новую версию вашего MainWindow, а не ссылку на уже существующую версию.В вашей форме MainWindow при открытии 2-й формы вам нужно передать ссылку на 2-ю форму, передав ее в метод Show (который хранит ее в переменной с именем владельца объекта типа), например:

AddEntryWindow addEntryWindow = new AddEntryWindow();
addEntryWindow.ShowDialog(this);

Тогда вы можете ссылаться на текстовое поле следующим образом:

foreach (AddEntry list in addedEntry)
{
     // Displaying and formating the output in text box in MainWindow.         
     ((MainWindow)owner).txtDisplayFileContent.Text += txtUserName.Text;
}   
1 голос
/ 01 ноября 2011

Это были ответы другие времена, аналогичные принципы ...

Взгляните на аналогичный вопрос

Чтобы «передать» информацию с: с Form2 на Form1, вам потребуется создать для нее открытый метод, чтобы показать, что вы хотите коснуться. Затем из второй формы (которая в основном имеет указатель на первую), вызовите этот метод с тем, что вы хотите сделать / действовать. Это также можно сделать с помощью открытого свойства, с которым нужно действовать.

От того, что у тебя уже есть работа ...

public partial class YourFirstForm
{
    // example to expose a method on first form and pass IN a value
    public void SetMyObject( string ValueFromSecondForm )
    {
       this.txtBox1.Text = ValueFromSecondForm;
    }

    // example via a property you are trying to set... identical in results
    public string ViaSetAsProperty
    { set { this.txtBox1.Text = value; } }

    // Now, the reverse, lets expose some things from form 1 to the second...
    public string GetMyObjectText()
    {
       return this.txtBox1.Text;
    } 

    // or via a GETTER property... 
    public string GettingText
    { get { return this.txtBox1.Text; } }


    // However, if you want to allow both set and get to form 1's values, 
    // do as a single property with both getter / setter exposed..
    public string TextContent
    {  get { return this.txtBox1.Text; }
       set { this.txtBox1.text = value; }
    }
}

Теперь, как получить из вашей ВТОРОЙ формы

публичный частичный класс YourSecondForm { Форма ObjRefToFirstForm;

public YourSecondForm( Form passedInVar )
{
   // preserve the first form
   ObjRefToFirstForm = passedInVar;
}

// Now, however you want to handle... via a button click, the text change event, etc
public void SendDataToForm1()
{
   // via calling the METHOD on form 1 that is public
   ObjRefToFirstForm.SetMyObj( this.SomeOtherTextbox.Text );

   // via a SETTER on form 1
   ObjRefToFirstForm.ViaSetAsProperty = this.SomeOtherTextbox.Text;


   // sample to GET something from form 1 via method
   string TestGet = ObjRefToFirstForm.GetMyObjectText();

   // or from the exposed property
   TestGet = ObjRefToFirstForm.GettingText;


   // Now, try via the one property that has both a setter and getter
   ObjRefToFirstForm.TextContent = this.SomeOtherTextbox.Text;
   TestGet = ObjRefToFirstForm.TextContent;
}

}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...