передача значений между формами (winforms) - PullRequest
4 голосов
/ 17 июня 2010

Странное поведение при передаче значений во вторую форму и из нее.

ParameterForm pf = new ParameterForm(testString);

работает

ParameterForm pf = new ParameterForm();
pf.testString="test";

не работает (testString определен как открытая строка)

возможноя что-то упустил?В любом случае, я бы хотел, чтобы второй вариант работал правильно, а сейчас - он возвращает нулевую ссылку на объектную ошибку.

Спасибо за помощь.

Размещение дополнительного кода здесь:

вызов

Button ParametersButton = new Button();
ParametersButton.Click += delegate
                {
                    ParameterForm pf = new ParameterForm(doc.GetElementById(ParametersButton.Tag.ToString()));
                    pf.ShowDialog(this);
                    pf.test = "test";
                    pf.Submit += new ParameterForm.ParameterSubmitResult(pf_Submit);
                };

определения и использования

   public partial class ParameterForm : Form
    {
        public string test;
        public XmlElement node;
        public delegate void ParameterSubmitResult(object sender, XmlElement e);
        public event ParameterSubmitResult Submit;

        public void SubmitButton_Click(object sender, EventArgs e)
        {
            Submit(this,this.node);
            Debug.WriteLine(test);
        }
     }

result: Submit - проверка ссылки на нулевой объект - ссылка на нулевой объект

Ответы [ 3 ]

2 голосов
/ 17 июня 2010
  • pf.ShowDialog(this); является блокирующим вызовом, поэтому pf.Submit += new ParameterForm.ParameterSubmitResult(pf_Submit); никогда не достигается: переключите порядок.

  • Submit(this,this.node); выбрасывает нулевую ссылку на объект, потому чтоему не назначено ни одного события (см. выше).Как правило, вы всегда должны сначала проверять: if (Submit != null) Submit(this,this.node);

  • Вы должны изменить `` pf.ShowDialog (this); to pf.Show (this); `, чтобы ваш главныйФорма не отключена, когда ваше диалоговое окно открыто, если вы этого хотите, или используйте модель ниже (типично для диалоговых окон).


Я не уверенчто должен делать pf_Submit, так что это может быть не лучшим способом сделать это в вашем приложении, но это как общие вопросы "Продолжить? Да / Нет".

Button ParametersButton = new Button();
ParametersButton.Click += delegate
    {
        ParameterForm pf = new ParameterForm(testString);
        pf.ShowDialog(this); // Blocks until user submits
        // Do whatever pf_Submit did here.
    };

public partial class ParameterForm : Form
{
    public string test;     // Generally, encapsulate these
    public XmlElement node; // in properties

    public void SubmitButton_Click(object sender, EventArgs e)
    {
        Debug.WriteLine(test);
        this.Close(); // Returns from ShowDialog()
    }
 }
0 голосов
/ 17 июня 2010

вещь была в строковом порядке:)

pf.Submit += new ParameterForm.ParameterSubmitResult(pf_Submit);

и

pf.Test = "test";

должны были быть установлены до

   pf.ShowDialog(this);

моя ошибка, что этот параметрпройти после того, как была отображена 2-я форма

thnx для ответов

0 голосов
/ 17 июня 2010

Когда вы хотите использовать свой второй вариант, вы должны использовать метод getString (), где вы можете поместить, например, «СравниваемаяСтрока». Как вы написали, «testString» должен быть методом (и получить скобки).

РЕДАКТИРОВАТЬ (немного точнее):

Вы можете написать:

pf.getString(testString);

, если "pf" является экземпляром вашего собственного класса, в противном случае вам пришлось бы искать, можете ли вы получить строку в этом классе.

...