使用公共文本框在表单之间传递值

时间:2011-07-10 05:10:01

标签: c# .net winforms visual-studio-2008 modal-dialog

已解决:原来是一个视觉工作室问题。封闭的视觉工作室,清洁和重建,价值开始显示。感谢大家的帮助,听起来我需要切换到VS2010。

这可能不是在表单之间传递值的最佳,最安全或首选的方法,但这是我正在尝试的方式。所以,请帮助我这样做。 之后,您提供了一个答案,我们非常欢迎您加入一些更好的方法来实现这一目标。

问题是,当模式对话框关闭并且我回到所有者时,模态的文本框值是空字符串而不是实际值。我已经在几个地方读过这不应该是这种情况,因为即使在模态盒处理之后数据也应该存在。这是我的代码。

public partial class PreferencesForm : Form
{

    public PreferencesForm()
    {
        InitializeComponent();
    }

    private void okButton_Click(object sender, EventArgs e)
    {
        if (masterRadioButton.Checked == true)
        {
            if (password1TextBox.Text != password2TextBox.Text)
            {
                errorLabel.Text = "Passwords do not match, please re-enter both passwords and try again.";
                this.Refresh();
            }
            else if (password1TextBox.Text == "" && password2TextBox.Text == "")
            {
                errorLabel.Text = "You must enter a password.";
            }
            else
            {
                okResultButton_Click(null, null);
            }
        }
        else if (singleRadioButton.Checked == true)
        {
            okResultButton_Click(null, null);
        }
    }

    private void cancelButton_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.Cancel;
        this.Dispose();
    }

    private void okResultButton_Click(object sender, EventArgs e)
    {
        // invisible button
        this.DialogResult = DialogResult.OK;
        this.Dispose();
    }

以下是将上述表单作为模态对话框调用的代码。

private void setPreferencesToolStripMenuItem_Click(object sender, EventArgs e)
    {
        PreferencesForm pf = new PreferencesForm();
        DialogResult result = pf.ShowDialog();
        if (result == DialogResult.OK)
        {
            if (pf.password1TextBox.Text != "")
            {
                masterPassword = pf.password1TextBox.Text;
            }
            else
            {
                masterPassword = null;
            }
        }
    }

感谢您的帮助。我在这里感到非常沮丧。 >:(

注意:password1TextBox变量的ReadOnly属性正确显示为true或false,具体取决于我在模式窗体中选择的内容,但text属性仍然无法正确显示。

3 个答案:

答案 0 :(得分:0)

我猜测Dispose也将处置它包含的控件。处理完控件后,文本可能也不再有效。在呼叫者中尝试Close而不是Dispose然后Dispose

答案 1 :(得分:0)

你应该倾听回答你问题的人。 Dispose应该清除已分配的内存,如果仍然可以获得ReadOnly属性则无关紧要。

不要在表单中调用Dispose,从调用代码调用dispose,如ShowDialog方法文档(http://msdn.microsoft.com/en-us/library/c7ykbedk.aspx#Y851)中的示例代码。请注意,在testDialog变量超出范围之前调用Dispose。

public void ShowMyDialogBox()
{
   Form2 testDialog = new Form2();

   // Show testDialog as a modal dialog and determine if DialogResult = OK.
   if (testDialog.ShowDialog(this) == DialogResult.OK)
   {
      // Read the contents of testDialog's TextBox.
      this.txtResult.Text = testDialog.TextBox1.Text;
   }
   else
   {
      this.txtResult.Text = "Cancelled";
   }
   testDialog.Dispose();
}

答案 2 :(得分:0)

我建议只需将Dialog控件的字符串保存到字符串属性中,并在关闭Dialog后检索类属性的值,而不是控件的属性值,并且不再担心Dispose Dispose或其他任何问题。

希望这有帮助