首页 > 解决方案 > 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);
}

标签: c#exceldatagridviewboolean-logic

解决方案


问题是由于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;
    }
}

请注意,上面的代码有几个问题:一个是它依赖于表单的初始化方式。


推荐阅读