c#不用new,从一个窗体调用另一个窗体中的非静态方法

时间:2022-08-30 22:40:54
如题, 我在Form1里写了一个非静态方法Save,我要在Form2里按下button后调用Save。
因为如果在Form2里用Form1 form = new Form1()的话,每次按button,Form1就会初始化。
public Form1()
        {
            InitializeComponent();
        }
        public static string ss;
        private void button1_Click(object sender, EventArgs e)
        {
            Form form = new Form2();
            form.Show();
        }
        public void Save()
        {
            listView1.Items.Add(ss);
        }
我需要在Form2里button按下后添加Items,再按在添加,而不是初始化后再添加

13 个解决方案

#1


定义成静态方法不就得了

既然是非静态方法,那么它就是实例的,是与某个实例相关的

你不传入实例,程序怎么知道你到底要调用哪个实例下面的实例方法?

#2


举个不太恰当的例子

假如办公室里,每个人都有水杯(实例的)

也有公共的水杯(静态的)

如果我自己说喝水,那么就是用我自己的杯子

而如果一个外人进来,说要喝水
要么他就用公共的杯子
要么他就得指定一个人,用他的杯子

而不要老想着说喝水就有人主动把杯子送上去

#3


直接改為靜態方法不就行了

#4


既然是公用方法,你可以把这个方法移出Form1,放到其他类里面,定义成静态或非静态看你方法里是干什么用的,相关值或控件你作为参数传过去就行了。

#5


不用实例化Form1,就证明这个方法与Form1木有关系,那还不如放在Form2里

#6


这思路不好,一般这种情况
两个窗口 form1 form2,在form1中点击按钮后显示form2,在form2中点击按钮后在form1中做某种操作;
我更喜欢用事件,比如
1,在form2中定义委托与事件(我记得c#里 void(object,EventArgs) 这种是有个系统委托的,记不得名字了,就自定义一个)
public delegate void ClickDelegate(object sender, EventArgs e);
public event ClickDelegate ClickAddButton;
2, 在form2的按钮点击事件的实现函数中触发自定义的事件
if(ClickAddButton)
 ClickAddButton(sender,e);
3,在form1中定义对应的事件实现函数及注册事件
private void form2ClickAddButton(object sender, EventArgs e)
{
this. Save();
}
private void button1_Click(object sender, EventArgs e)
        {
Form form = new Form2();
form.ClickAddButton+=new ClickDelegate(form2ClickAddButton);
form.Show();
        }
这样,form1中的save函数也不用写成public及static;
窗口之间我不太喜欢直接拿着窗口引用调来调去,看着烦,尤其是子窗口调父窗口,太容易一团糟了

#7


最简单的就是在Form1里添加一个静态的引用
class Form1 : Form
{
    public static Form1 Instance;

    public Form1()
    {
        Instance = this;
        InitialComponents();
    }

    public void Save (string ss)
    {
        listView1.Items.Add(ss);
    }
}

然后在Form2里调用
Form1.Instance.Save("xxxxx");

#8


非静态的你能访问那个ss的值?

#9


遍历 Application.OpenForms 就可找到所有可视的窗体,根据窗体的名字可定位到所需窗体

#10


6楼的方法靠谱

#11


虽然不知道Instance得具体用法,但6楼完美的解决了我的问题

#12


该回复于2016-02-02 14:52:58被管理员删除

#13


7楼的方法有效,简单明了,很多人说直接改成静态方法不可取,因为很多情况下是用一个窗体1中调用另一个窗体2的控件,在窗体2中写个操作窗体2中控件的方法,再在窗体1中调用调用窗体2的那个方法,参数用公共类传递。如果窗体2中的方法设置成静态会出现“对象引用对于非静态的字段、方法或属性“FormName.ControlName”是必需的“,不过6楼的方法值得研究

#1


定义成静态方法不就得了

既然是非静态方法,那么它就是实例的,是与某个实例相关的

你不传入实例,程序怎么知道你到底要调用哪个实例下面的实例方法?

#2


举个不太恰当的例子

假如办公室里,每个人都有水杯(实例的)

也有公共的水杯(静态的)

如果我自己说喝水,那么就是用我自己的杯子

而如果一个外人进来,说要喝水
要么他就用公共的杯子
要么他就得指定一个人,用他的杯子

而不要老想着说喝水就有人主动把杯子送上去

#3


直接改為靜態方法不就行了

#4


既然是公用方法,你可以把这个方法移出Form1,放到其他类里面,定义成静态或非静态看你方法里是干什么用的,相关值或控件你作为参数传过去就行了。

#5


不用实例化Form1,就证明这个方法与Form1木有关系,那还不如放在Form2里

#6


这思路不好,一般这种情况
两个窗口 form1 form2,在form1中点击按钮后显示form2,在form2中点击按钮后在form1中做某种操作;
我更喜欢用事件,比如
1,在form2中定义委托与事件(我记得c#里 void(object,EventArgs) 这种是有个系统委托的,记不得名字了,就自定义一个)
public delegate void ClickDelegate(object sender, EventArgs e);
public event ClickDelegate ClickAddButton;
2, 在form2的按钮点击事件的实现函数中触发自定义的事件
if(ClickAddButton)
 ClickAddButton(sender,e);
3,在form1中定义对应的事件实现函数及注册事件
private void form2ClickAddButton(object sender, EventArgs e)
{
this. Save();
}
private void button1_Click(object sender, EventArgs e)
        {
Form form = new Form2();
form.ClickAddButton+=new ClickDelegate(form2ClickAddButton);
form.Show();
        }
这样,form1中的save函数也不用写成public及static;
窗口之间我不太喜欢直接拿着窗口引用调来调去,看着烦,尤其是子窗口调父窗口,太容易一团糟了

#7


最简单的就是在Form1里添加一个静态的引用
class Form1 : Form
{
    public static Form1 Instance;

    public Form1()
    {
        Instance = this;
        InitialComponents();
    }

    public void Save (string ss)
    {
        listView1.Items.Add(ss);
    }
}

然后在Form2里调用
Form1.Instance.Save("xxxxx");

#8


非静态的你能访问那个ss的值?

#9


遍历 Application.OpenForms 就可找到所有可视的窗体,根据窗体的名字可定位到所需窗体

#10


6楼的方法靠谱

#11


虽然不知道Instance得具体用法,但6楼完美的解决了我的问题

#12


该回复于2016-02-02 14:52:58被管理员删除

#13


7楼的方法有效,简单明了,很多人说直接改成静态方法不可取,因为很多情况下是用一个窗体1中调用另一个窗体2的控件,在窗体2中写个操作窗体2中控件的方法,再在窗体1中调用调用窗体2的那个方法,参数用公共类传递。如果窗体2中的方法设置成静态会出现“对象引用对于非静态的字段、方法或属性“FormName.ControlName”是必需的“,不过6楼的方法值得研究