如何在c#中创建全局列表

The*_*nan 0 c# windows-forms-designer visual-studio-2012

我的项目中有三个窗体,我有一个对象类.如何列出可供所有三种表单使用的对象列表?

And*_*rew 5

您可以创建一个包含对象实例的类:

public class MyClass
{

    public static List<string> MyList {get; set}
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以从表单中访问它

MyClass.MyList = new List<string>();
Run Code Online (Sandbox Code Playgroud)

显然字符串将被替换为对象的名称.


dim*_*ror 5

  1. 更改访问修饰符在Form2中为控件/字段public Anywhere Form1设置访问修饰符.

    Form2 f = new Form2();
    f.ShowDialog();
    this.textBox1.Text = f.textBox1.Text;
    
    Run Code Online (Sandbox Code Playgroud)
    • 最快的实施和方便的方式
    • 与OOP的所有基础相反
    • 传播只是较早的一种形式
    • 表单f仅使用ShowDialog()显示,即在第一个表单控件中仅返回第二个结束.通过在第一种形式中保持第二个表单的链接来避免这种情况
  2. 使用公共财产/方法.该方法非常类似于第一个在Form2类中定义的属性(或方法).

    在Form2类中定义一个属性(或方法)

    public string Data
    {
        get
        {
            return textBox1.Text;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    Form1中的任何位置

    Form2 f = new Form2();
    f.ShowDialog();
    this.textBox1.Text = f.Data;
    
    Run Code Online (Sandbox Code Playgroud)
    • 与OOP的所有基础知识并不矛盾
    • 同样的
  3. 数据传输到构造函数Form2.更改构造函数Form2

    public Form2(string data)
    {
        InitializeComponent();
        this.data = data;
    }
    string data;
    
    Run Code Online (Sandbox Code Playgroud)

    并在Form1的任何位置创建一个形状如下:

    Form2 f = new Form2(this.textBox1.Text);
    f.ShowDialog();
    
    Run Code Online (Sandbox Code Playgroud)
  4. 发送构造函数的链接.更改构造函数Form2.

    public Form2(Form1 f1)
    {
        InitializeComponent();    
        string s = f1.textBox1.Text;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    并在Form1的任何位置创建一个形状,以便将其传递给第一个表单

    Form2 f = new Form2(this);
    f.ShowDialog();
    
    Run Code Online (Sandbox Code Playgroud)
    • 访问第一个表单的所有打开的字段/功能
    • 可以在两个方向上进行数据传输
    • 违反巴解组织
  5. 使用属性"parent".创建第二个表单时设置所有者

    Form2 f = new Form2();
    f.Owner = this;
    f.ShowDialog();
    
    Run Code Online (Sandbox Code Playgroud)

    在第二个,我们确定所有者

    Form1 main = this.Owner as Form1;
    if(main != null)
    {
        string s = main.textBox1.Text;
        main.textBox1.Text = "OK";
    }
    
    Run Code Online (Sandbox Code Playgroud)
    • 访问第一个表单的所有打开的字段/功能
    • 可以在两个方向上进行数据传输
    • 不要违反巴解组织
  6. 使用单独的课程.创建一个单独的类,更好的静态,主要是命名空间,例如在Program.cs文件中

    static class Data
    {
        public static string Value { get; set; }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    他的公共财产/方法可以从任何形式获得.

    Data.Value = "111";
    
    Run Code Online (Sandbox Code Playgroud)
    • 数据以多种形式主动使用时最方便的方式.
  7. 构造函数中的传递方法.创建委托

    public delegate void MyDelegate(string data);
    
    Run Code Online (Sandbox Code Playgroud)

    在Form 1中,创建一个将处理接收数据的方法

    void func(string param)
    {
        //Process
    }
    
    Run Code Online (Sandbox Code Playgroud)

    创建第二个表单如下:

    Form2 f = new Form2(new MyDelegate(GetData));
    f.ShowDialog();
    
    Run Code Online (Sandbox Code Playgroud)

    更改第二个表单的构造函数以接受委托

    MyDelegate d;
    public Form2(MyDelegate sender)
    {
        InitializeComponent();
        d= sender;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    并随时发送数据

    d(textBox1.Text);
    
    Run Code Online (Sandbox Code Playgroud)
  8. 使用委托创建单独的类.在主命名空间中创建单独的类

    public static class Data
    {
        public delegate void MyEvent(string data);
        public static MyEvent EventHandler;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    在第一种形式中,添加一个处理程序

    void func(string param)
    {
        MessageBox.Show(param);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    并初始化EventHandler

    Data.EventHandler = new Data.MyEvent(func);
    
    Run Code Online (Sandbox Code Playgroud)

    以通常的方式创建第二个表单,然后从中调用它

    Data.EventHandler(textBox1.Text);
    
    Run Code Online (Sandbox Code Playgroud)
    • 最灵活的数据传输方式
    • 难以实施和理解