2010-07-12 60 views
2

情况是这样的,我有来自同一解决方案/项目的两种不同形式。我需要做的是提取表单A中标签的值并将其加载到表单B中。尽可能多地使用该代码,因为它只会与我的整个程序发生冲突:在两个窗体窗体之间传递值

FormB myForm = new FromB(label.Text); 
myForm.ShowDialog(); 

我现在正在尝试的是一个具有get和property属性的类,并设置为我想要传递的值。但是,每当我从FormB访问get方法时,它都会返回一个空值。

我希望有人能帮助我。任何其他方式来做到这一点非常感谢。 :)

public class Miscellaneous 
    { 
     string my_id; 

     public void SetID(string id) 
     { 
      my_id = id; 
     } 

     public string GetID() 
     { 
      return my_id; 
     } 
    } 
+1

请告诉我们您的获取和设置的一些代码在第二种形式

Public property somevariable as sometype 

和访问它在第一种形式声明公共财产varible。 – Andreas 2010-07-12 08:57:57

回答

2

你可以做这样的事情:

子窗体

public string YourText { get; set; } 

public TestForm() 
{ 
    InitializeComponent(); 
} 

public void UpdateValues() 
{ 
    someLabel.Text = YourText; 
} 

启动它

var child = new TestForm {YourText = someTextBox.Text}; 

child.UpdateValues(); 

child.ShowDialog(); 

通过这种方法,您不必更改构造函数,也可以添加其他构造函数。

它们为空的原因是属性是在构造函数之后设置的,你也可以这样做,为你的getters和setter添加一些逻辑,但是我会考虑不影响UI上的属性!

private string _yourText = string.Empty; 
public string YourText 
{ 
    get 
    { 
     return _yourText; 
    } 
    set 
    { 
     _yourText = value; 
     UpdateValues(); 
    } 
} 

在这种情况下,当您设置属性时,UI将自动更新。

+0

我尝试使用你发布的第一个,它完美的工作,虽然我还是有点困惑。非常感谢:)我正在尝试你给的第二个。 – Smiley 2010-07-12 09:11:57

+0

它只是“重构”的代码,this:'var child = new TestForm {YourText = someTextBox.Text};'与TestForm child = new TestForm()相同。 child.YourText = someTextBox.Text;'但第一个看起来更好。请记住,在实际设置任何属性之前调用构造函数,使用调试器遍历代码并查看它的功能。 – 2010-07-12 09:15:54

+0

你可以做'set {someLabel.Text = value; ''直接。不需要像那样包裹它。 – 2010-07-12 09:16:23

0

那么一种方法是在您的应用程序中创建一个单例类。当您形成b加载或标签更改时,使用该值更新单身人士。然后当形成一个需要的值时,它可以在你的应用程序中获得单例的实例,并且它将具有该值。

有可能是更干净的方法来做到这一点,但只是想一个简单的方法来回传递信息和存储这两种形式所需的任何信息。

编辑:这里是一个单身,我从这里拉的例子:

http://www.yoda.arachsys.com/csharp/singleton.html

public sealed class Singleton 
{ 
    static readonly Singleton instance=new Singleton(); 

    // Explicit static constructor to tell C# compiler 
    // not to mark type as beforefieldinit 
    static Singleton() 
    { 
    } 

    Singleton() 
    { 
    } 

    public static Singleton Instance 
    { 
     get 
     { 
      return instance; 
     } 
    } 
} 

现在你需要做的就是把这个类的命名空间中是两种形式访问然后你可以调用这个类的实例属性,然后引用你的值。您可以为其添加属性以及任何想要共享的属性。当你想找回这些价值,你会这样称呼它:

Singleton.Instance.YourProperty 
+0

你能告诉我如何创建单身课程吗?我对C#的广泛特性有点新鲜。谢谢。 :) – Smiley 2010-07-12 09:02:32

+0

如果你只是谷歌单身模式,你会得到一些例子。但是我会看看我能否找到一个真正快速添加到我的答案中。 – spinon 2010-07-12 09:05:43

+0

谢谢你。我试图实现这一个,看看哪个更好。 :)谢谢 – Smiley 2010-07-12 09:29:49

0

您可以使用一个静态变量/方法来保存/传递控件的值(当它被更改时)。

您可以使用表格参考控制参考直接获取和传递值。

您可以使用自定义事件(通知订阅的代码)。

btw。 FormB myForm = new FromB(label.Text);没有工作,因为您正在传递值,并且在创建FormB时该值为空。 FormB myForm = new FromB(label);会工作。

0
((Form2)Application.OpenForms["Form2"]).textBox1.Text = "My Message"; 
+0

欢迎使用stackoverflow!提供示例代码的简短说明总是更好,以提高发布准确性:) – 2012-10-29 14:39:30

0

使用实例

Dim obj as New form2() 
obj .somevariable ="value" 
相关问题