c# - Winforms:布尔逻辑无法正常工作
问题描述
我的情况是我有Form 1和Form 2。在Form 1中我有button1和button2。我bool dtgmb
在 Form1 中将 a 定义为 false。但是,如果单击 button2,dtgmb
则为 true。
在表格 2 中,我有 1 个 DTG 和 button3,其中行的所有数据都已定义。因此,我运行实例,其中 ifdtgmb
为假(单击按钮 1),然后显示内容,object[] rows
如果dtgmb
为真(单击按钮 2),然后显示内容object[] rows1
。然后button3会被点击返回Form1。
但是,如果我先单击 button1,然后返回 Form 1 并单击 button2,则 Form2 将显示object[] rows
两次的显示内容。然后,如果我关闭应用程序并再次重新启动,这次我先单击 button2,然后返回 Form 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);
}
解决方案
问题是由于dtgmb
被标记为静态。这意味着所有实例,无论它们的生命周期,都将共享相同的值。静态变量在应用程序启动时初始化为它们的本机默认值(例如,整数初始化为零,而布尔值初始化为假)。
如果您删除静态修饰符,您将需要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);
}
请记住,直接共享字段不是一个好习惯,但这有助于了解问题所在。
在评论后编辑
我不清楚你想要达到什么目的。当您尝试将类型作为函数的正式参数传递时,您的代码不起作用。我重构了您的代码以进行编译(但我不明白它的行为方式):
程序.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;
}
}
请注意,上面的代码有几个问题:一个是它依赖于表单的初始化方式。
推荐阅读
- django-models - 如何包含模型和视图的计数和求和查询集
- javascript - 如何使用 React createElement 添加点击事件
- java - 我们如何将 XSL 转换为 XML 格式
- python - 在 mac 上安装 glfw
- node.js - 哪个更安全,HTTP 会话中的 JWT 或客户端请求标头中的 JWT?
- python - 遍历列列表以打印出 .value_counts()
- html - Cron 编辑器不显示单选按钮
- java - 如何从 Glide 记录每个请求 url?
- python - 如何使用正则表达式在python中的特定字符串后查找带逗号的数字?
- javascript - 我正在将 excel 表转换为 JSON 对象。虽然从 excel 转换日期给了我一些随机数。如何将其转换为 JSON 中的日期