C# 如何向Datagridview(已由datasource填充)添加一列
我有两个DataGridView。我调用方法C# 如何向Datagridview(已由datasource填充)添加一列,c#,winforms,datagridview,C#,Winforms,Datagridview,我有两个DataGridView。我调用方法CellContentClick,该方法必须使用DB调用另一个datagridview。我必须在第二个datagridview中添加另一列并填充它 如何填充第二个datagridview: //Connetion to Access DB const string strProvider = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\DataBase v1.3.ac
CellContentClick
,该方法必须使用DB调用另一个datagridview。我必须在第二个datagridview中添加另一列并填充它
如何填充第二个datagridview:
//Connetion to Access DB
const string strProvider =
@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\DataBase v1.3.accdb";
// Query to DB
var strSql = "SELECT * FROM [Проф прививки] WHERE id_ученика=" + dataGridView2.Rows[e.RowIndex].Cells[0].Value;
var con = new OleDbConnection(strProvider);
var cmd = new OleDbCommand(strSql, con);
cmd.CommandType = CommandType.Text;
var da = new OleDbDataAdapter(cmd);
var scores = new DataTable();
da.Fill(scores);
dataGridView3.DataSource = scores;
所以,它工作得很好
但是,如果我通过设计器向datagridview添加一个新列并填充数据,则该列不会被填充
如何填写新列:
for (var i = 0; i < dataGridView3.Rows.Count; i++)
{
//Query to the other table
strSql = "SELECT [Название прививки] FROM [Список прививок] WHERE [id_тип_прививки]=" +
(int) dataGridView3.Rows[i].Cells[2].Value;
//Use method GetFromDb which returns the selection
dataGridView3.Rows[i].Cells[3].Value = GetFromDb(strSql, 0);
}
}
您最好学会在查询中使用参数,以避免sql注入。数据在那里,但你看不到?如果您从设计器中添加了列,可能会使其成为单元格[0],因为它是创建的第一列?是的,数据在那里,但我无法看到何时调用第一次方法。第二次之后,我看到所有列都被填满了。我重新放置了列s为什么它不是单元格[0]。填充该列时使用的是什么事件?您可能应该向我们展示整个方法。您可能需要CellClick而不是CellContentClick。CellContentClick要求用户实际单击单元格的文本部分,而不仅仅是在单元格中。你在画画吗?如果你最小化表单然后还原它,你会看到列中的数据吗?不,我不使用CellPaint。第一次单击单元格(上数据网格)-第二次单击-
public void dataGridView2_CellContentClick(object sender, DataGridViewCellEventArgs e)
{try
{
const string strProvider =
@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\DataBase v1.3.accdb";
var strSql = "SELECT * FROM [Проф прививки] WHERE id_ученика=" +
dataGridView2.Rows[e.RowIndex].Cells[0].Value;
var con = new OleDbConnection(strProvider);
var cmd = new OleDbCommand(strSql, con);
cmd.CommandType = CommandType.Text;
var da = new OleDbDataAdapter(cmd);
var scores = new DataTable();
da.Fill(scores);
dataGridView3.DataSource = scores;
//подтягиваем заболевания
for (var i = 0; i < dataGridView3.Rows.Count; i++)
{
strSql = "SELECT [Название прививки] FROM [Список прививок] WHERE [id_тип_прививки]=" +
(int) dataGridView3.Rows[i].Cells[2].Value;
dataGridView3.Rows[i].Cells[3].Value = GetFromDb(strSql, 0);
}
}
catch (Exception ex)
{
MessageBox.Show(@"Ошибка! " + ex.Message);
}
public string GetFromDb(string query, int num)
{
var result = "";
var conn = new OleDbConnection();
conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\DataBase v1.3.accdb";
try
{
conn.Open();
var cmd = new OleDbCommand(query, conn);
var dr = cmd.ExecuteReader();
while (dr.Read())
{
result = dr.GetValue(num).ToString();
}
conn.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + @" : " + ex.StackTrace, @"Load Error");
}
return result;
}