【问题标题】:Dockpanel Suite and passing data across multiple formsDockpanel Suite 和跨多个表单传递数据
【发布时间】:2013-05-13 18:42:34
【问题描述】:

您好,我找不到任何与我要查找的内容完全一致的内容。我在网站上看到了很多在两种形式之间传递数据的例子,例如

How can I pass values from one form to another? Using The Controls Of One Form Into Another How to access controls on an inherited form?

在几个博客和几个小时的阅读和没有得到它的基础上。

所以基本上这就是我想要完成的行为 使用 DockPanel 套件


主窗体parentForm 有一个固定在里面的表格Form1,它总是在那里。不能被删除或重新加载是恒定的(所以我假设应该总是相同的实例),它有一个文本框frm1BoxparentForm 有一个带有按钮button1 的菜单栏,它将打开第三个表单Form2,它还有一个文本框frm2Box。我希望能够单击button1(来自parentForm)打开Form2,并将frm1Box 中的任何内容传递给frm2Box


所以从阅读看来,设置属性似乎是每个人都推荐的,所以这就是我所做的,如果我只是通过单击 form1 的按钮来打开 form2 并传递数据,它会很好用,但我似乎不知道添加另一个表单时将其删除。这显然不是我的完整代码,如果需要它只是为了节省空间,我很乐意发布我的实际代码。

//Parent Form
public partial class parentForm : Form

public static Form1 form1 = new Form1();

public void showForm1()
    {
        form1 = new Form1();
        form1.Show(dockPanel1, DockState.DockLeft);
    }
private void parentForm_Load(object sender, EventArgs e)
    {
        showForm1();
    }
private void button1_Click(object sender, EventArgs e)
    {
        Form2 form2 = new Form2();
        form2.CustNameCb = form1.CustName;
        form2.Show();
    }



//Form1
public partial class Form1 : DockContent
   {
private string _custName;

public Form2()
    {
        InitializeComponent();

    }
public string CustName
    {
        get
        {
            return _custName;
        }
        set
        {
            _custName = value;
            frm1Box.Text = _custName;
        }

    }


//Form2
public partial class Form2 : Form
   {
private string _custNameCb;

public Form2()
    {
        InitializeComponent();

    }
public string CustNameCb
    {
        get
        {
            return _custNameCb;
        }
        set
        {
            _custNameCb = value;
            frm2Box.Text = _custNameCb;
        }

    }

我认为我完全错过了这个概念,但在我的搜索中找不到“好的”示例,或者至少找不到我可以遵循的示例。我是编程新手,尤其是 C#,所以请原谅我的经验不足。如果有人有更好的方法,请告诉我。我考虑过使用 SQL 来存储数据。如果可能的话,我宁愿不使用基于文件的存储。另外值得注意的是,一旦我找到了正确的方法,它就需要是可扩展的,因为当我实际实现它时,parentForm 上将有 5 个不同的按钮打开 5 个不同的表单,但仍然从同一个 Form1 中提取数据form1 将有大约 10 个文本框的数据要提取。

提前感谢您的任何回复。

【问题讨论】:

    标签: c# .net winforms forms dockpanel-suite


    【解决方案1】:

    你离得太近了。在您的属性中,“setter”在 TextBox 中显示传递的值,但“getter”如何从 TextBox 中检索值?它只返回存储在私有变量中的值。对于 Form1,您是否通过代码(可能通过 TextChanged() 事件)以某种方式(未显示)设置私有变量“_custName”?

    如果不是,请将属性更改为:

    public string CustName
    {
        get
        {
            return frm1Box.Text;
        }
        set
        {
            frm1Box.Text = value;
        }
    }
    

    这将返回实际在 TextBox 中的值,并希望将其转换为您的第二种形式...

    【讨论】:

    • 呵呵.. 在看了几个小时并试图学习这个之后,我问了这个问题,不得不洗手几个小时。回来看到你的答案,这很有意义。工作出色。我花了两倍的时间来发布这个问题,然后修复我的所有代码并使这项工作大声笑。谢谢!
    【解决方案2】:

    我没有在 C# 中使用过这个控件,只是在 VB 中使用过,但我会尽力描述如何在 C# 中完成此操作。

    要访问另一个窗体上的控件,调用窗体必须具有它试图访问的窗体的实例。这可以在使用依赖注入初始化表单对象时完成。

    Form1 frm1 = new Form1();
    
    Form2 frm2 = new Form2(frm1);
    
    frm1.show(dockpanel1, DockState.dockright);
    
    frm2.show(dockpanel1, DockState.dockleft);
    

    Form 2 需要 Form1 类型的实例变量。

    private Form1 frm1;
    

    这个变量将通过类的构造函数来设置。

    public Form2(Form1 f) {
    
        frm1 = f;
    
    }
    

    Form2 现在可以访问 Form1 的公共内容。例如,假设 Form1 有一个名为 txtName 的文本框。您可以使用以下代码设置 text 属性:

    frm1.txtName.text="Any Name";
    

    【讨论】:

      猜你喜欢
      • 2017-05-08
      • 2012-01-30
      • 2015-07-03
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多