【问题标题】:Select all checkboxes for updating data in datagridview选中所有复选框以更新 datagridview 中的数据
【发布时间】:2020-03-03 08:16:52
【问题描述】:

我正在尝试通过选择我要更新的行的复选框标题,然后按下更新按钮来更新 datagridview 中的一些数据。问题是它没有按预期更新行,它更新了除一列之外的所有列。我需要一种方法来更新复选框标题选择的行的所有列。

这是我当前的代码:

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

【问题讨论】:

  • 缺少哪一列?是不是“ISSU_FLG”?
  • ISSU_FLG 仅用于更新数据。基本上我想通过选择所有复选框并单击更新按钮来更新数据库中复选框值更改的那些列值。

标签: c# datagridviewcheckboxcell


【解决方案1】:

好的,我不知道你的问题是什么,但我有一些想法。

首先,由于某些原因,当您添加行时,可能会丢失一些行。从您提供的代码中,我看不出代码有任何问题,看起来您根据复选框值正确添加到列表中。为确保这不是问题,请在 if 语句 if (addRows.Count &gt; 0) 上放置一个断点并检查“addRows”变量的值以确保您期望的所有行都在其中。如果您不确定如何执行此操作,请在 Visual Studio(或您使用的任何 IDE)中进行谷歌调试。

其次,这个objConnect.UpdateDatabase(addRows.ToArray()); 有一个问题我不认识这个代码,也不确定它的作用。这是 EFC 的一部分吗?您是否使用自定义库来更新您的数据库?这很可能是问题所在。根据您提供的代码,我不确定数据库的结构、更新方式以及您使用的技术。也许在您的问题中提供数据库的设置?但这看起来像是问题可能出现的地方。

我还收到了一些可选的反馈,一般来说,您的代码存在一些问题,我对您有一些建议,但让我们逐步解决。

首先,而不是:

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))

同样的原则。 If 语句将基于布尔值执行代码。 例如。

true == true 是真的。

false == true 为 false。

关键是,没有必要将你的值与真值进行比较,因为当它为真时,无论如何它都是真的,当它为假时,它无论如何都是假的。 查看布尔代数以了解更多信息。

结合接下来的两个 if。

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

像这样:

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

注意:始终在使用变量之前检查它是否为 null,如果不这样做,您将面临 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);
    }
}

目前,您添加到要更新为“addRows”的行,并在此处迭代每一行。现在我认为您要做的是一次更新每一行,但随后您调用

objConnect.UpdateDatabase(addRows.ToArray())

这是一个数组,它是多行的。因此,您更新的是完整的集合或行,而不是每一行。所以不需要遍历每一行。要修复此代码,请将其更改为:

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

所以删除 for 循环。

您可以做的更多,但这是一个不错的开始。

【讨论】:

  • 还是不行。作为附加信息,如果我手动一个一个地选中该框,它将起作用。但是,如果我选择复选框标题,它将留下一列
  • 您必须更具体。它遗漏了您的哪一列? '项目名称'? “数量”?
  • 对不起,我的意思不是 COLUMN,而是 ROW
  • 我已经重写了答案,不知道是什么问题,但是看起来像数据库设置。
  • 很抱歉回复您的评论迟了,我已经尝试了您的代码并在我的语法中实现了但它不起作用,它仍然留下 1 行(1 行)
猜你喜欢
  • 2014-10-18
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多