【问题标题】:Passing data between C# forms在 C# 表单之间传递数据
【发布时间】:2016-08-28 06:49:07
【问题描述】:

我正在努力在两个表单之间传递数据(我想做的只是在 Form1 中有一个文本框,并在位于 Form2 中的 textbox1 中显示该文本框值)。使用 WPF,我将如何解决这个问题?已经查看了很多解决方案,但似乎根本无法让它们中的任何一个起作用。

对于我想要显示值的表单(在 tbd.Text 中),代码如下:

namespace test
{
    /// <summary>
    /// Interaction logic for OptionDisplayWindow.xaml
    /// </summary>
    public partial class OptionDisplayWindow : Window
    {
        public OptionDisplayWindow()
        {

            InitializeComponent();
            tbd.Text = "k"; //want to change this value based on "s" in the other form

        }

转出文本的形式(想显示字符串):

public void Button1_Click(object sender, RoutedEventArgs e)
        {
            string s = "testText"


       }

我已经尝试过关于 SO 的所有其他答案(过去 6 个小时都在尝试)并且完全没有运气。

编辑 2:使用此处列为最佳答案的方法Send values from one form to another form 我已经为 Form1 提供了以下代码:

private void ttbtn_Click(object sender, RoutedEventArgs e)
        {
            using (Form2 form2 = new Form2())
            { 
                tbd.Text = form2.TheValue;
                }
            }

Form2 的代码:

        public string TheValue
        {
            get { return arrayTest.Text; }
        }

但是,我收到错误“Form 2”:在 using 语句中使用的类型必须隐式转换为“System.IDisposable”。

【问题讨论】:

  • 除非您发布一些代码,否则它将关闭。
  • 抱歉,SO新手,请稍等!
  • @user3879060 实际上已经有很多关于这个的教程:stackoverflow.com/questions/1559770/… google 的第一个结果
  • 尝试了该解决方案,但它给了我两个错误:...“必须隐式转换为 System.IDisposable”,以及“bool 没有 'OK' 的定义”。
  • 给我们一些背景信息...你想从Form1打开Form2吗?事情的流程是什么?

标签: c# wpf


【解决方案1】:

您放入示例项目中的代码(您在 cmets 中作为链接提供)应该在您的问题中。鉴于您更容易理解您要做什么并为您提供可行的解决方案。

我建议创建一个“DataTransferObject”并在每个表单之间传递。

public class Dto
{
    public string Text;
}

MainWindow 中的代码将如下所示:

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        var dto = new Dto();
        window2 win2 = new window2();
        win2.Dto = dto;
        win2.ShowDialog();
        textBox1.Text = dto.Text;
    }

window2 中的代码如下所示:

    public Dto Dto;

    private void textBox2_TextChanged(object sender, TextChangedEventArgs e)
    {
        if (this.Dto != null)
        {
            this.Dto.Text = textBox2.Text;
        }
    }

这是在表单之间传输数据的一种方式(大约一百万种)。使用数据传输对象的一个​​优点是它让您开始将数据与 UI 分离,这通常是一件非常好的事情。

【讨论】:

  • 谢谢。我实际上是在尝试以另一种方式传递数据(没有说清楚,抱歉),并试图这样做,但我只在第二个窗口上得到一个空框(我怀疑是因为 Dto 总是为空,而我似乎无法改变这一点)。这是我尝试更改它的可怕尝试中的更新代码:/。 s000.tinyupload.com/index.php?file_id=45688752685779824697
  • @user3879060 - 您上传的文件在我下载时显示“此文件包含病毒或恶意软件”。无论如何,Dto 可以毫无问题地双向工作。
  • 抱歉,这是我所做的截图imgur.com/a/qAmJL dto 最终保持为空,因此不会传输到 window2 文本框。
  • 您正在window2 中创建MainWindow 的新实例 - 这不会做任何有用的事情。在MainWindow 中,您需要实例化并填充Dto,但这里不需要Dto 的字段。在window2 中,您需要该字段。在window2 中设置字段后,您就可以填充文本框了。
【解决方案2】:

另一种在表单之间传递数据的简单方法是使用应用程序的设置。

第 1 步:创建设置,打开“项目”菜单并选择“测试属性...”

这将带您进入设置页面,根据需要创建一个设置名称,我将我的命名为“PassString”并确保它是字符串类型并且范围设置为用户。

第 2 步。让我们将字符串设置设置为您的 textbox.text 属性,将这些更改添加到代码中:

private void button1_Click(object sender, RoutedEventArgs e)
{
    Properties.Settings.Default.PassString = textBox1.Text;
    window2 win2 = new window2();
    win2.ShowDialog();
}

第 3 步。更新第二个窗口初始化过程中的文本。

    public OptionDisplayWindow()
    {
        InitializeComponent();
        tbd.Text = Properties.Settings.Default.PassString;
    }

附:您可能需要添加引用才能访问您的应用程序设置。

    using test.Properties;                 

【讨论】:

  • 谢谢:D。有什么方法可以将该方法与多个变量一起使用,还是我需要为每个变量创建不同的设置?例如。如果一个表单有 textBox1 和 textBox2 并且我想将它们传递给第二个窗口中的一个变量。
  • 设置的类型有很多种,这个例子只是传递一个字符串,你可以随时设置或获取,你到底是什么意思?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多