C# 使用DataGridView在文本框中显示来自其他表单的数据库信息
我试图以另一种形式将MySQL数据库中的信息(用户评论)显示到文本框中。我使用datagridview来选择UID,以标识注释是针对哪个用户的。我的代码在注释表单的加载事件中,如下所示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
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?