在两个打开的窗体之间传递一个TextBox

本文关键字:一个 之间 TextBox 两个 窗体 | 更新日期: 2023-09-27 18:08:45

我有两个windows窗体。F1有一个填充了数据的表格的GridView。理想情况下,用户点击"导出到Excel"按钮,一个弹出窗口F2将显示,并要求用户输入文件名保存在其文本框中,然后返回F1。

我在线尝试了几种方法,包括重载构造函数。它确实帮助我在两个表单之间传递值,但是在用户确认新文件名后,它会打开一个带有用户输入的新F1。基本上我结束了两个F1(一个旧的一个与我的数据在gridview,一个新的obe与用户的输入)

谁能给点建议?

我试过这个…http://www.daniweb.com/software-development/csharp/threads/358513/pass-the-text-box-value-from-one-form-to-another-form-textbox

//form1:
public partial class Form1 : Form
{
    Form2 f2;
    public Form1()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        if (f2 == null)
            f2 = new Form2();
        f2.ValueFromForm1(textBox1.Text);
        f2.Show();
    }
}
//form2:
public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }
    public void ValueFromForm1(string value)
    {
        textBox1.Text = value;
    }
}

在两个打开的窗体之间传递一个TextBox

有一个适当的通用对话框来选择文件名。这些常见对话框的存在是因为像打开/保存文件或选择颜色或字体这样的常见操作应该在任何应用程序中都是相同的。不使用它们会迫使用户学习新的用户界面。
因此,建议使用公共对话框(如果没有令人信服的理由来做不同的事情)

private void button1_Click(object sender, EventArgs e)
{
    SaveFileDialog dlg = new SaveFileDialog();
    dlg.Filter = "Excel files (*.xls)|*.xls";
    if(dlg.ShowDialog() == DialogResult.OK)
       textBox1.Text = dlg.FileName;
}

参见SaveFileDialog类

然而,如果你真的想要有你自己的窗体来选择一个文件名,那么你需要这样修改你的代码

private void button1_Click(object sender, EventArgs e)
{
    using(Form2 f2 = new Form2())
    {
        // Pass the current text 
        f2.FileSelected = textBox1.Text;
        if(DialogResult.OK == f2.ShowDialog())
        {
            // read back the changes....
            textBox1.Text = f2.FileSelected;
        }
    }
}

//form2:
public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }
    // The property used to exchange the text between the two forms
    public string FileSelected {get;set;}
    private void Form_Load(object sender, EventArgs e)
    {
        // Let the user edit an initial value
        textBoxOnForm2.Text = this.FileSelected;
    }
    private void cmdOK_Click(object sender, EventArgs e)
    {
        // Save the edited text to the property
        this.FileSelected = textBoxOnForm2.Text;
    }
}

如果我理解正确的话,听起来你不一定要把一个值从Form1传递到Form2,而是从Form2 返回Form1。要做到这一点,不要在Form2中打开Form1的实例,而是创建Form2,使引用返回到原始 Form1,并可以在该引用上设置值。像这样:

public class Form1 : Form
{
    // other stuff
    private void button1_Click(object sender, EventArgs e)
    {
        if (f2 == null)
            f2 = new Form2(this);
        f2.Show();
    }
}
public class Form2 : Form
{
    private Form1 Form1Reference { get; set; }
    // other stuff
    public Form2(Form1 form1Reference)
    {
        Form1Reference = form1Reference;
    }
}

现在您可以从Form2中访问和设置Form1的开放实例上的值。例如,如果Form1有一个属性:

public string SomeValue { get; set; }

然后在Form2的实例中,你可以获取/设置该属性:

Form1Reference.SomeValue = textBox1.Text;