【问题标题】:Pass a TextBox between two open forms?在两个打开的表单之间传递一个文本框?
【发布时间】:2014-06-16 23:09:49
【问题描述】:

我有两个窗体。 F1 有一个填充数据的表格的 GridView。理想情况下,用户单击“导出到 Excel”按钮,会出现一个弹出窗口表单 F2,并要求用户键入要保存在其 TextBox 中的文件名,然后返回 F1。

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

谁能给点建议?

这个我试过了...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;
    }
}

【问题讨论】:

  • 你需要展示你所尝试的。
  • 当你说“回到 1”时,你希望发生什么?从您的问题来看,尚不清楚您打算实现什么。在我看来,您可能还想考虑更系统的方法,例如 MVC 或类似模式...
  • 通常情况下,最好的方法是拥有一个核心程序,该程序可供所有事物使用,然后可用于在不同形式之间传递值。
  • 什么不起作用?这段代码看起来应该创建并显示Form2 的实例,并成功地向该实例提供来自Form1 的值。有什么问题?
  • @Kris 用户输入新文件名并单击确认按钮后,F2 关闭。用户输入的字符串会携带到打开的F1。

标签: c# winforms


【解决方案1】:

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

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 class

但是,如果您真的想拥有自己的表单来选择文件名,那么您需要以这种方式更改您的代码

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;
    }
}

【讨论】:

  • 感谢您的宝贵时间。我最终使用了您推荐的常用对话框。
【解决方案2】:

如果我对您的理解正确,听起来您不一定要尝试将值从Form1 传递到Form2,而是从Form2 返回 到Form1。为此,不要从Form2 中打开Form1 的实例,而是创建Form2 以使引用回到原始 @987654328 @ 并且您可以在该引用上设置一个值。像这样的:

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;

【讨论】:

    猜你喜欢
    • 2016-02-19
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多