因为如果在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;
窗口之间我不太喜欢直接拿着窗口引用调来调去,看着烦,尤其是子窗口调父窗口,太容易一团糟了
两个窗口 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里添加一个静态的引用
然后在Form2里调用
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
#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;
窗口之间我不太喜欢直接拿着窗口引用调来调去,看着烦,尤其是子窗口调父窗口,太容易一团糟了
两个窗口 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里添加一个静态的引用
然后在Form2里调用
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
#13
7楼的方法有效,简单明了,很多人说直接改成静态方法不可取,因为很多情况下是用一个窗体1中调用另一个窗体2的控件,在窗体2中写个操作窗体2中控件的方法,再在窗体1中调用调用窗体2的那个方法,参数用公共类传递。如果窗体2中的方法设置成静态会出现“对象引用对于非静态的字段、方法或属性“FormName.ControlName”是必需的“,不过6楼的方法值得研究