Winforms:布尔逻辑不能正常工作

时间:2019-01-15 08:50:43

标签: c# excel datagridview boolean-logic

我的情况是我有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);
}

1 个答案:

答案 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;
    }
}

请注意,上面的代码有几个问题:一个问题全部取决于表单的初始化方式。

相关问题