Winforms: булева логика не работает должным образом - PullRequest
0 голосов
/ 15 января 2019

Моя ситуация такова, что у меня есть Форма 1 и Форма 2. В Форме 1 у меня есть button1 и button2. Я определяю bool dtgmb как ложное по всей Форме1. Однако, если кнопка2 нажата, dtgmb имеет значение true.

В форме 2 у меня есть 1 DTG и кнопка3, где все данные строк были определены. Поэтому я запускаю экземпляр, при котором, если dtgmb равно false (нажата кнопка 1), то отображается содержимое object[] rows, а если dtgmb имеет значение true (нажата кнопка 2), то вместо этого отображается содержимое object[] rows1. Затем будет нажата кнопка 3, чтобы вернуться в форму 1.

Однако, если я сначала нажму кнопку 1, а затем вернусь к Форме 1 и нажму кнопку 2, Форма 2 покажет содержимое дисплея object[] rows для обоих раз. Затем, если я закрою приложение и перезапущу снова, и на этот раз я сначала нажму кнопку 2, а затем вернусь к Форме 1 и нажму кнопку 1, форма 2 покажет содержимое дисплея 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 голосов
/ 15 января 2019

Проблема связана с тем, что dtgmb помечен как статический. Это означает, что все экземпляры, независимо от срока их службы, будут иметь одинаковое значение. Статические переменные инициализируются, когда приложение начинает использовать свои собственные значения по умолчанию (например, целые числа инициализируются в ноль, а логические значения равны false).

Если вы удалите статический модификатор, вам нужно будет вызвать метод 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;
    }
}

Обратите внимание, что в приведенном выше коде есть несколько проблем: одна из них зависит от того, как инициализируются формы.

...