Установите все флажки для обновления данных в datagridview - PullRequest
0 голосов
/ 03 марта 2020

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

enter image description here

Вот мой текущий код:

    private void Main_Load(object sender, EventArgs e)
    {
        DataGridViewCheckBoxColumn checkColumn = new DataGridViewCheckBoxColumn();
        checkColumn.Name = "chk";
        checkColumn.HeaderText = "Select";
        checkColumn.Width = 50;
        checkColumn.ReadOnly = false;
        checkColumn.FillWeight = 10;
        dataGridView1.Columns.Add(checkColumn);
    }
    private void checkboxheader_Click(object sender, EventArgs e)
    {
        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            if (Convert.ToBoolean(row.Cells["chk"].Value) == false)
            {
                row.Cells["chk"].Value = true;
            }
            else
            {
                row.Cells["chk"].Value = false;
            }
        }
    }
    private void btnCHKPO_Click(object sender, EventArgs e)
    {
        Cursor = Cursors.WaitCursor;
        DialogResult result = MessageBox.Show("Check Purchase Request ?", "Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (result == DialogResult.Yes)
            {
                int i = 0;
                    var addRows = new List<DataRow>();
                    foreach (DataGridViewRow row in dataGridView1.Rows)
                    {
                        if (Convert.ToBoolean(row.Cells["chk"].Value) == true)
                        {
                            addRows.Add(((DataRowView)row.DataBoundItem).Row);
                            var ST = 2;
                            row.Cells["ISSU_FLG"].Value = ST;
                        }
                    }
                    if (addRows.Count > 0)
                    {
                        if ((addRows != null))
                        {
                            for (; i < addRows.Count(); i++)
                            {
                                try
                                {
                                    objConnect.UpdateDatabase(addRows.ToArray());
                                    Po = 1;
                                }
                                catch (Exception err)
                                {
                                    MessageBox.Show(err.Message,
                                         "Information",
                                         MessageBoxButtons.OK,
                                         MessageBoxIcon.Asterisk,
                                         MessageBoxDefaultButton.Button1);
                                }
                            }
                            if (Po == 1)
                            {
                                MessageBox.Show("Purchase Request Has Been Checked !" + "\n" + "Please search the data again",
                                                  "Information",
                                                  MessageBoxButtons.OK,
                                                  MessageBoxIcon.Asterisk,
                                                  MessageBoxDefaultButton.Button1);
                                Cursor = Cursors.Default;
                                btnSave_Click(this, new EventArgs());
                            }
                        }
                    }
                    else
                    {
                        MessageBox.Show("Please Select Row For Checking PO Info !",
                         "Error",
                         MessageBoxButtons.OK,
                         MessageBoxIcon.Stop,
                         MessageBoxDefaultButton.Button1);
                        Cursor = Cursors.Default;
                    }
                }
            }

1 Ответ

0 голосов
/ 04 марта 2020

Хорошо, я не знаю, в чем ваша проблема, но у меня есть несколько идей.

Во-первых, существует вероятность того, что по некоторым причинам при добавлении строк некоторые из них отсутствуют. Из кода, который вы дали, я не вижу ничего плохого в коде, похоже, вы правильно добавляете в список на основе значения флажка. Чтобы убедиться, что это не проблема, поставьте точку останова в операторе if if (addRows.Count > 0) и проверьте значение переменной 'addRows', чтобы убедиться, что все ожидаемые строки находятся там. Если вы не уверены, как это сделать, отладка Google в Visual Studio (или любой IDE, которую вы используете).

Во-вторых, есть проблема с этим objConnect.UpdateDatabase(addRows.ToArray()); Я не узнаю этого код, и не уверен, что он делает. Это часть EF C? Используете ли вы пользовательскую библиотеку для обновления базы данных? Вероятно, в этом и заключается проблема. Исходя из предоставленного вами кода, я не уверен в структуре базы данных, как она обновляется и какие технологии вы используете для этого. Может быть, предоставить настройки для базы данных в вашем вопросе? Но похоже, что проблема может возникнуть.

У меня также есть несколько дополнительных отзывов, есть некоторые проблемы с вашим кодом в целом, о которых я вам так советую, но давайте разберемся с ним по частям.

Во-первых, вместо:

private void checkboxheader_Click(object sender, EventArgs e)
{
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        if (Convert.ToBoolean(row.Cells["chk"].Value) == false)
        {
            row.Cells["chk"].Value = true;
        }
        else
        {
            row.Cells["chk"].Value = false;
        }
    }
}

Сделайте это:

private void checkboxheader_Click(object sender, EventArgs e)
{
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        row.Cells["chk"].Value = !Convert.ToBoolean(row.Cells["chk"].Value) ;
    }
}

Это улучшает читабельность вашего кода, в основном это говорит: «Установите значение этой ячейки в противоположность тому, что было», без потребность в большом операторе if.

Затем в первом блоке foreach измените:

if (Convert.ToBoolean(row.Cells["chk"].Value) == true)

на

if (Convert.ToBoolean(row.Cells["chk"].Value))

Тот же принцип. Если операторы будут выполнять код на основе логического значения. Например,

true == true - это true.

false == true - это false.

Дело в том, что нет необходимости сравнивать ваше значение с true, как, например, когда это правда, это будет правдой независимо, и когда это ложно, это будет ложью независимо от. Изучите булеву алгебру, чтобы узнать больше.

Объедините следующие два ifs.

if (addRows.Count > 0)
{
    if ((addRows != null))
    {

Примерно так:

if (addRows != null && addRows.Count > 0)

Примечание: всегда проверяйте нулевое значение в переменной прежде чем использовать его, если вы не рискуете исключение нулевой ссылки. Делает ли ваша программа sh, если вы пытаетесь выполнить обновление, ничего не выбрав? здесь ваша итерация по каждой строке. Теперь я думаю, что вы пытаетесь обновить каждую отдельную строку по одной, но затем вы вызываете

objConnect.UpdateDatabase (addRows.ToArray ())

Передается массив, состоящий из нескольких строк. Таким образом, вы обновляете полный набор или ряды, а не каждый отдельный ряд. Таким образом, нет необходимости проводить l oop через каждый ряд. Чтобы исправить этот код, измените его на:

try
{
    objConnect.UpdateDatabase(addRows.ToArray());
    Po = 1;
}
catch (Exception err)
{
    MessageBox.Show(err.Message,
         "Information",
         MessageBoxButtons.OK,
         MessageBoxIcon.Asterisk,
         MessageBoxDefaultButton.Button1);
}

Так что удалите для l oop.

Вы можете сделать даже больше, но это неплохое начало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...