如何在DataGridView上访问特定的更新行列

时间:2014-12-08 17:56:40

标签: c# datagridview datagrid

我正在使用C#应用程序并使用DataGridView组件。我的datagrid连接到我的数据库并加载一个数据表。用户填充空字段并将更改保存在DataGridView和数据库中。问题是我需要使用用户填写的特定列索引。

这是创建datagrid的代码:

void gridDoldur()
{
    try
    {
        string query = "SELECT DersId FROM Dersler WHERE DersAd= @dersad";
        SqlConnection conn = new SqlConnection("Data Source=SEFA-PC;Initial Catalog=proje;Integrated Security=True;Pooling=False;MultipleActiveResultSets=True");
        SqlCommand comd = new SqlCommand(query, conn);
        comd.Parameters.AddWithValue("@dersad", dersBox.SelectedItem);

        conn.Open();
        SqlDataReader dre;              // dersin adından id'si çekildi
        dre = comd.ExecuteReader();
        dre.Read();
        int dersId = dre.GetInt32(0);  

        dt.Clear();
        sda = new SqlDataAdapter("SELECT * FROM Notlar WHERE DersId=" + dersId, conn);

        sda.Fill(dt);
        notGrid.DataSource = dt;
        notGrid.Visible = true;
        kaydetButton.Visible = true;
        notGrid.Columns[0].Visible = false;
        notGrid.Columns[8].Visible = false;
        notGrid.Columns[1].ReadOnly = true;
        notGrid.Columns[7].ReadOnly = true;

        sBuilder = new SqlCommandBuilder(sda);
        conn.Close();
}

这就是我的网格看起来的样子: http://imgur.com/q65FW1N

我需要访问已编辑行的元素。

2 个答案:

答案 0 :(得分:1)

您可以旋转DataTable上的行并检查其DataRowState以确定它们是否已更改。

foreach (DataRow row in dt.Rows)
{
    if (row.RowState == DataRowState.Modified)
    {
        var infoINeed = (int) row["SomeInformation"];
        var infoByColumnIndex = row[3].ToString();
        // Do stuff
    }
}

dt.AcceptChanges();

完成处理后,您需要确保拨打AcceptChanges()。这会将RowState行上的DataRowState.Modified更改为DataRowState.Unchanged

答案 1 :(得分:0)

对于您的目的而言,这可能是过度的,因为它会在每次更改任何单元格时触发,但是您可以从中获得一般性的想法。您可以使用DataGridView的CellValueChanged事件处理程序轻松获取行索引。这里的想法是注意哪个行在此方法中有变化,如下所示:

private List<int> editedRows = new List<int>;

private void myDGV_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
  if (!this.editedRows.Contains(e.RowIndex))
  {
     editedRows.Add(e.RowIndex);
  }
}

有了这个想法,你可以这样调用你的方法:

foreach (int row in this.editedRows)
{
  this.MyMethod((int)myDGV[row, 0].Value, (int)myDGV[row, 1].Value, (int)myDGV[row, 2].Value, ...);
}

或者:

foreach (int row in this.editedRows)
{
  DataGridViewRow r = myDGV.Rows[row];
  this.MyMethod((int)r.Cells[0].Value, (int)r.Cells[1].Value, (int)r.Cells[2].Value, ...);
}

注意:请记住将单元格值转换为数据类型(我假设基于屏幕截图的int)。

我在任何地方都没有看到你的方法的背景,所以希望这能让你大致了解下一步该去哪里。

编辑:我会选择杰夫的回答。它可以获得相同的想法,而无需手动存储更新的行列表。