C# 使用DataGridView在文本框中显示来自其他表单的数据库信息

C# 使用DataGridView在文本框中显示来自其他表单的数据库信息,c#,mysql,winforms,datagridview,C#,Mysql,Winforms,Datagridview,我试图以另一种形式将MySQL数据库中的信息(用户评论)显示到文本框中。我使用datagridview来选择UID,以标识注释是针对哪个用户的。我的代码在注释表单的加载事件中,如下所示 try { // Check if a row is selected. string cRow = admin.gridClients.CurrentRow.Cells[0].Value.ToString(); st

我试图以另一种形式将MySQL数据库中的信息(用户评论)显示到文本框中。我使用datagridview来选择UID,以标识注释是针对哪个用户的。我的代码在注释表单的加载事件中,如下所示

    try
        {
            // Check if a row is selected.
            string cRow = admin.gridClients.CurrentRow.Cells[0].Value.ToString();
            string Query = "SELECT Admin_Com FROM cpr_clients WHERE Client_ID='" + cRow + "';";
            MySqlConnection myConn = new MySqlConnection(strConnect);
            MySqlCommand myCmd = new MySqlCommand(Query, myConn);
            MySqlDataReader myReader;
            myConn.Open();
            myReader = myCmd.ExecuteReader();
            while (myReader.Read())
            {
                txtAdminCom.Text = myReader["Admin_Com"].ToString();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

编辑:我已经更新了我的代码。即使我选择了另一行,代码也只检索datagridview中第一行的注释。

您的问题可能是源(
admin.gridClients
)网格视图中没有
CurrentRow
。这将导致尝试访问
.Cells
时抛出所获得的错误,因为
CurrentRow==null

由于您只需要此值来标识
frmadmincoment
中的Id,因此请读取源表单中的值,然后将其传递给
frmadmincoment
的构造函数:

private string _id;

public frmAdminComment(string id)
{
    // Initialization code you already have.

    // Set the Id for this instance.
    _id = id;
}
现在在加载方法中引用
\u id
变量:

string Query = "SELECT Admin_Com FROM cpr_clients WHERE Client_ID='" + _id + "';";
这就增加了在创建
frmAdminComment
admin
对象中检查有效值的负担

// In the "admin" object.
if (gridClients.CurrentRow == null)
{
    MessageBox.Show("No CurrentRow is set in the source grid.");
    return;
}
else
{
    // CurrentRow is set - safe to reference it.
    var adminComment = new frmAdminComment(gridClients.CurrentRow.Cells[0].Value.ToString());
    adminComment.Show();
}

您可能想考虑使用<代码> SelectedRows <代码>属性。它的工作原理如下:

// Check if a row is selected.
// In the "admin" object.
if (gridClients.SelectedRows.Length == 0)
{
    MessageBox.Show("No rows selected in the source grid.");
}
else
{
    // CurrentRow is set - safe to reference it.
    var adminComment = new frmAdminComment(gridClients.SelectedRows[0].Cells[0].Value.ToString());
    adminComment.Show();
}

请注意,如果使用
SelectedRows
,则可能需要在
gridClients
上设置属性,以便在选择模式设置为FullRowSelect的情况下,一次仅选择一行。

是否将当前表单对象作为另一个表单的构造函数中的参数传递?在上面的代码中,声明了
admin
的位置,以及
gridClients
的修饰符范围是什么?@JasonFaulkner admin被声明为当前表单类中的一个实例,范围被设置为public。我已经在函数的开头添加了完整条件,但它仍然只返回MessageBox,因此它仍然是null@TobyCook - 正确的。如果看到消息框,则表示
CurrentRow
为空/未在
admin.gridClients
中设置。我更新了答案,在创建
frmAdminComment
对象之前检查了这一点,以便提醒用户需要选择一行。我知道您来自哪里,但由于我使用ContextMenuStrip作为查看注释的方法,这意味着在打开表单之前已经选择了一行。对不起,我把事情复杂化了this@TobyCook-不一定。如果右键单击调用上下文菜单,则并不意味着选择了相应的行。为了测试起见,在调用上下文菜单之前单击鼠标左键(这将选择该行),看看结果是否不同。我尝试了你所说的,结果与之前相同。如果需要,我可以将我的源文件上传到pastebin?