代码之家  ›  专栏  ›  技术社区  ›  Smiley

在两个Windows窗体之间传递值

  •  2
  • Smiley  · 技术社区  · 15 年前

    情况就是这样,我有两种不同的形式来自同一个解决方案/项目。我需要做的是提取表A中标签的值并将其加载到表B中。尽可能避免使用此代码,因为它只会与我的整个程序冲突:

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

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

    我希望有人能帮我。任何其他方法都非常感谢。:)

        public class Miscellaneous
        {
           string my_id;
    
           public void SetID(string id)
           {
               my_id = id;
           }
    
           public string GetID()
           {
               return my_id;
           }
         }
    
    5 回复  |  直到 7 年前
        1
  •  2
  •   Filip Ekberg    15 年前

    你可以这样做:

    子形式

    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();
    

    使用这种方法,您不必更改构造函数,也可以添加另一个构造函数。

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

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

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

        2
  •  0
  •   Jaroslav Jandek    15 年前

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

    你可以使用 表单引用 控制参考 直接获取和传递值。

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

    顺便说一句。 FormB myForm = new FromB(label.Text); 不起作用,因为您正在传递值,并且在创建时该值为空。 FormB . FormB myForm = new FromB(label); 会起作用的。

        3
  •  0
  •   spinon    15 年前

    一种方法是在应用程序中创建一个单例类。当表单B加载或标签更改时,使用值更新singleton。然后,当表单A需要值时,它可以在应用程序中获取单例实例,并且将具有该值。

    可能有更清洁的方法,但只是想一个简单的方法来来回传递信息和存储这两个表单所需的任何信息。

    编辑:下面是我从这里提取的一个单例实例:

    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
    
        4
  •  0
  •   codertuhin    13 年前
    ((Form2)Application.OpenForms["Form2"]).textBox1.Text = "My Message";
    
        5
  •  0
  •   Muhammad Saeed    7 年前

    以第二种形式声明公共财产变量

    Public property somevariable as sometype
    

    并使用实例以第一种形式访问它

    Dim obj as New form2()
    obj .somevariable ="value"