我正在使用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
我需要访问已编辑行的元素。
答案 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)。
我在任何地方都没有看到你的方法的背景,所以希望这能让你大致了解下一步该去哪里。
编辑:我会选择杰夫的回答。它可以获得相同的想法,而无需手动存储更新的行列表。