C# 如何向Datagridview(已由datasource填充)添加一列

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

我有两个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.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;
    }