【问题标题】:C# Linq to use CellEndEdit of DataGrid to update databaseC# Linq 使用 DataGrid 的 CellEndEdit 更新数据库
【发布时间】:2016-02-18 11:17:58
【问题描述】:

我想知道如何使用 Linq 引用已编辑单元格的列和行。我有一个包含 3 列的 DataGrid,其中将接收 1 到 100 之间的整数(在第 3 列中)。单元格编辑结束后,我需要验证整数是否在 1 到 100 之间,如果是,则将它们插入数据库。我的问题是,我不知道如何引用被选中的单元格。我对此很陌生,所以有没有一种简单的方法来引用已编辑单元格的列/行,以及同一行中相应数据的列/行。

我想我需要这样开始:

private void gvMarks_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        if () //if new data between 1 and 100
        {
            //enter into database using Linq
            using (DataModel db = new DataModel())
            {
                //Linq code here

                db.SaveChanges();
                this.student_CourseTableAdapter.Fill(this.libraryDBDataSet.Student_Course);
            }
        }
        else
        {
            MessageBox.Show("Error Message");
        }


    }

【问题讨论】:

    标签: c# winforms linq datagrid


    【解决方案1】:

    我想出了如何去做。仅出于上下文考虑,我正在更新名为“Student_Course”的数据库表上名为“Mark”的列。表中的 3 列分别是 CID、SID、Mark。代码如下:

    private void gvMarks_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
                int marks = Convert.ToInt32(gvMarks.Rows[e.RowIndex].Cells[e.ColumnIndex].Value);
                int CIDref = Convert.ToInt32(gvMarks.Rows[e.RowIndex].Cells[0].Value);
                int SIDref = Convert.ToInt32(gvMarks.Rows[e.RowIndex].Cells[1].Value);
                if (marks <= 100 && marks >= 0)
                {
                    using (DataModel db = new DataModel())
                    {
                        Student_Course newMark = db.Student_Course.First(s => s.CID == CIDref && s.SID == SIDref);
                        newMark.Mark = marks;
                        db.SaveChanges();
                    }
                    MessageBox.Show("Marks updated");
                }
                else
                {
                    MessageBox.Show("Out of Range");
                }
        }
    

    【讨论】:

    • 你需要在一个重复循环中,并替换e.RowIndex循环中的行:dataGridView1.Rows [j]。查看以前的编辑
    • 始终是第一行,只需将 e.RowIndex 替换为 0
    • 列[2] 已编辑。然后我需要 Column[0] 和 Column[1] 中的详细信息,以便 Linq 代码可以在正确的位置更新数据库。 Column[0] 和 Column[1] 都是数据库中的唯一关系,因此只有一个实例在特定组合中它们都将位于同一行中。 Linq 代码基本上是说“将已编辑单元格中的值插入行中,其中列等于已编辑单元格中的相应列值”。
    • 但是您需要遍历所有行以确保值正确,因为它需要覆盖第 0 列和第 1 列中的行
    • 我不确定你的意思。我发布的当前代码正在做我需要做的事情。它不需要遍历每一行。它只需要找到具有相应数据的行。
    【解决方案2】:
    private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex == dataGridView1.Columns["columnName"].Index && e.RowIndex >= 0)
        {
            for (int j = 0; j < dataGridView1.RowCount; j++)
            {
                int value = int.Parse(dataGridView1.Rows[j].Cells["columnName"].Value.toString())
    
                if ( value > 1 && value < 10)
                {
                    //Some Code;
                }
                else
                {
                    MessageBox.Show("Error Message");
                }
            }
        }
    }
    

    【讨论】:

    • 我试过了,它说'对象引用未设置为对象实例'
    【解决方案3】:
    private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex == dataGridView1.Columns["marks"].Index && e.RowIndex >= 0)
        {
            bool outOfRange;
    
            for (int j = 0; j < dataGridView1.RowCount; j++)
            {
                int value = int.Parse(dataGridView1.Rows[j].Cells["marks"].Value.toString())
    
                if ( value > 100 || value < 0)
                {
                    outOfRange = true;
                }
            }
    
            if(!outOfRange)
            {
                using (DataModel db = new DataModel())
                {
                    //sure that the code is correct?
                    Student_Course newMark = db.Student_Course.First(s => s.CID == CIDref && s.SID == SIDref);
                    newMark.Mark = marks;
                    db.SaveChanges();
                }
                MessageBox.Show("Marks updated");
            }
            else
            {
                MessageBox.Show("Out of Range");
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-12-25
      • 2014-04-11
      • 2013-06-25
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多