Передача переменной между winforms - PullRequest
5 голосов
/ 22 ноября 2010

У меня проблема с делегатами в приложении Windows.Forms.

Существует две формы:

  1. основная форма, в которой есть кнопка с названием «Настройки».

  2. форма «настройки», это «дочерняя» форма.

Когда я нажимаю кнопку «Настройки» в главной форме, открывается экземпляр формы «Настройки».

Моя проблема в том, что мне нужно передать переменную в форму «Настройки» при ее открытии. Так что новая форма покажет переменный текст. Я не знаю, как получить информацию в дочерней форме «Настройки». Я сделал это, следуя учебному пособию онлайн и не мог понять из учебника, как читать информацию в форме назначения.

Вот что я сделал, код в основной форме:

public partial class MainForm : Form
{

    /// <summary>
    /// delegate to send data between forms
    /// </summary>
    public delegate void PageInfoHandler(object sender, PageInfoEventArgs e);
    /// <summary>
    /// event of the delegate
    /// </summary>
    public event PageInfoHandler PageInfoRetrieved;

    //other stuff, events blabla

    private void toolStripBtnSettings_Click(object sender, EventArgs e)
    {
        PageInfoEventArgs args = new PageInfoEventArgs(SomeString);
        this.OnPageInfoRetrieved(args);

        SettingsForm settingsForm = new SettingsForm();
        settingsForm.ShowDialog();  
    }

    private void OnPageInfoRetrieved(PageInfoEventArgs args)
    {
        if (PageInfoRetrieved != null)
            PageInfoRetrieved(this, args);
    }
}

Ответы [ 5 ]

12 голосов
/ 22 ноября 2010

Передайте любую информацию, которую вы хотите добавить, в конструктор формы настроек и предоставьте методы доступа для вещей, которые вам нужны.

public class SettingsForm : WinForm
{
    private string m_Data;
    private int m_nExample = 0;

    // ctor
    public SettingsForm(string _data)
    {
        m_Data = data;  // you can now use this in SettingsForm
    } // eo ctor

    public int Example {get{return(m_nExample);} }
} // eo class SettingsForm

В приведенном выше «примере» вы можете создать SettingForm со строкой и получить целое число, которое оно может использовать. В вашем коде:

private void toolStripBtnSettings_Click(object sender, EventArgs e)
{
    PageInfoEventArgs args = new PageInfoEventArgs(SomeString);
    this.OnPageInfoRetrieved(args);

    SettingsForm settingsForm = new SettingsForm("some data to pass");
    settingsForm.ShowDialog();  

    int result = settingsForm.Example; // retrieve integer that SettingsForm used
}
5 голосов
/ 22 ноября 2010

Форма Setttings является классом.Теперь он ваш, и вы можете делать с ним все что угодно.Поэтому добавьте параметр (или сколько хотите) в его конструктор.Затем в вашей MainForm вызовите SettingsForm (что угодно) и все готово.

4 голосов
/ 22 ноября 2010

Я бы предложил добавить свойство в SettingsForm.

Затем назовите его так:

SettingsForm settingsForm = new SettingsForm(); 
settingform.myProperty = myPropertyvalue;
settingsForm.ShowDialog();   
2 голосов
/ 22 ноября 2010

Вы можете создать параметризованный конструктор для формы настроек, который принимает текст и присваивает ему свойство в форме

public partial class SettingsForm : Form
{

   public string DisplayText {get;set;}

   public SettingsForm(string text)
   {
        DisplayText = text;
   }
}

тогда вы просто инициализируете настройки следующим образом (из вашей основной формы)

var settingsForm = new SettingsForm("my init text");

Ваша форма настроек будет правильно инициализирована, и у вас есть нужный текст в свойстве DisplayText, готовый к использованию

2 голосов
/ 22 ноября 2010

Почему бы вам не добавить в форму настроек конструктор, который принимает параметры и передает туда любые нужные вам данные?

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