我的情况是我有Form 1和Form2。在Form 1中,我有button1和button2。我在整个Form1中将bool dtgmb
定义为false。但是,如果单击button2,则dtgmb
为true。
在表格2中,我有1个DTG和button3,其中所有行的数据都已定义。因此,我运行一个实例,其中如果dtgmb
为假(单击按钮1),则显示object[] rows
的内容,如果dtgmb
为真(单击按钮2),则显示的内容改为object[] rows1
。然后,单击button3以返回到Form1。
但是,如果我先单击button1,然后返回到Form 1并单击button2,则Form2将同时显示object[] rows
的显示内容。然后,如果我关闭该应用程序并再次重新启动,这一次我首先单击button2,然后返回到窗体1并单击button1,则Form2将两次显示object[] rows1
的显示内容。
下面是我的代码:
表格1
public bool dtgmb = false;
private void button1_Click(object sender, EventArgs e)
{
//Forms saved in class called FormsCollection
FormsCollection.Form1.Hide();
FormsCollection.Form2.Show();
}
private void button2_Click(object sender, EventArgs e)
{
FormsCollection.Form1.Hide();
dtgmb = true;
FormsCollection.Form2.Show();
}
表格2
private void Form2_Load(object sender, EventArgs e)
{
stuff(FormsCollection.Form1);
}
public void stuff(Form1 form)
{
DataGridViewCheckBoxColumn check = new DataGridViewCheckBoxColumn();
DataGridViewCheckBoxColumn check1 = new DataGridViewCheckBoxColumn();
dataGridView4.ColumnCount = 1;
dataGridView4.Columns[0].Width = 380;
dataGridView4.Columns[0].Name = "Item";
string[] row1 = new string[] { "Tables" };
string[] row2 = new string[] { "Chairs" };
string[] row3 = new string[] { "Lamps" };
string[] row4 = new string[] { "Pillows" };
string[] row5 = new string[] { "Blankets" };
object[] rows = new object[] { row1, row2, row3, row4, row5 };
object[] rows1 = new object[] { row1, row2, row3, row4 };
if (form.dtgmb == false)
foreach (string[] rowArray in rows)
{
this.dataGridView4.Rows.Add(rowArray);
}
else
foreach (string[] rowArray in rows1)
{
this.dataGridView4.Rows.Add(rowArray);
}
check.HeaderText = "Pass";
check1.HeaderText = "Fail";
dataGridView4.Columns.Add(check);
dataGridView4.Columns.Add(check1);
}
答案 0 :(得分:0)
该问题是由于dtgmb
被标记为静态的。这意味着所有实例,无论它们的寿命如何,都将共享相同的值。
静态变量在应用程序开始使用其本机默认值时初始化(例如,整数初始化为零,而布尔值初始化为false)。
如果删除static修饰符,则需要使用对表单的引用来调用stuff
方法。由于您没有向我们展示您在哪里打电话的内容,因此我在此处发布您发布的内容的重构。
Form1.cs :
public bool dtgmb = false;
private void button1_Click(object sender, EventArgs e)
{
//Forms saved in class called FormsCollection
FormsCollection.Form1.Hide();
FormsCollection.Form2.Show();
}
private void button2_Click(object sender, EventArgs e)
{
FormsCollection.Form1.Hide();
dtgmb = true;
FormsCollection.Form2.Show();
}
和 Form2.cs
public void stuff(Form1 form)
{
DataGridViewCheckBoxColumn check = new DataGridViewCheckBoxColumn();
DataGridViewCheckBoxColumn check1 = new DataGridViewCheckBoxColumn();
dataGridView4.ColumnCount = 1;
dataGridView4.Columns[0].Width = 380;
dataGridView4.Columns[0].Name = "Item";
string[] row1 = new string[] { "Tables" };
string[] row2 = new string[] { "Chairs" };
string[] row3 = new string[] { "Lamps" };
string[] row4 = new string[] { "Pillows" };
string[] row5 = new string[] { "Blankets" };
object[] rows = new object[] { row1, row2, row3, row4, row5 };
object[] rows1 = new object[] { row1, row2, row3, row4 };
if (form.dtgmb == false)
foreach (string[] rowArray in rows)
{
this.dataGridView4.Rows.Add(rowArray);
}
else
foreach (string[] rowArray in rows1)
{
this.dataGridView4.Rows.Add(rowArray);
}
check.HeaderText = "Pass";
check1.HeaderText = "Fail";
dataGridView4.Columns.Add(check);
dataGridView4.Columns.Add(check1);
}
请记住,直接共享字段不是一个好习惯,但这对于理解问题所在是很好的。
在评论后进行编辑
我不清楚您要达到什么目标。您尝试将类型作为函数的形式参数传递时,代码不起作用。我重构了您的代码以进行编译(但我不知道它的行为):
Program.cs
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
new Form1().Show();
Application.Run(new Form2());
}
Form1.cs
public partial class Form1 : Form
{
public bool dtgmb = false;
public Form1()
{
InitializeComponent();
FormCollection.Form1 = this;
}
private void button1_Click(object sender, EventArgs e)
{
//Forms saved in class called FormsCollection
FormCollection.Form1.Hide();
FormCollection.Form2.Show();
}
private void button2_Click(object sender, EventArgs e)
{
FormCollection.Form1.Hide();
dtgmb = true;
FormCollection.Form2.Show();
}
private void Form1_Click(object sender, EventArgs e)
{
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
FormCollection.Form1 = null;
}
}
public static class FormCollection
{
public static Form1 Form1;
public static Form2 Form2;
}
Form2.cs
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
FormCollection.Form2 = this;
}
private void Form2_Load(object sender, EventArgs e)
{
stuff(FormCollection.Form1);
}
public void stuff(Form1 form)
{
DataGridViewCheckBoxColumn check = new DataGridViewCheckBoxColumn();
DataGridViewCheckBoxColumn check1 = new DataGridViewCheckBoxColumn();
dataGridView4.ColumnCount = 1;
dataGridView4.Columns[0].Width = 380;
dataGridView4.Columns[0].Name = "Item";
string[] row1 = new string[] { "Tables" };
string[] row2 = new string[] { "Chairs" };
string[] row3 = new string[] { "Lamps" };
string[] row4 = new string[] { "Pillows" };
string[] row5 = new string[] { "Blankets" };
object[] rows = new object[] { row1, row2, row3, row4, row5 };
object[] rows1 = new object[] { row1, row2, row3, row4 };
if (form.dtgmb == false)
foreach (string[] rowArray in rows)
{
this.dataGridView4.Rows.Add(rowArray);
}
else
foreach (string[] rowArray in rows1)
{
this.dataGridView4.Rows.Add(rowArray);
}
check.HeaderText = "Pass";
check1.HeaderText = "Fail";
dataGridView4.Columns.Add(check);
dataGridView4.Columns.Add(check1);
}
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
FormCollection.Form2 = null;
}
}
请注意,上面的代码有几个问题:一个问题全部取决于表单的初始化方式。