【问题标题】:Displaying Database Information in TextBox From Another Form Using DataGridView使用 DataGridView 在另一个窗体中的 TextBox 中显示数据库信息
【发布时间】:2015-02-19 10:14:09
【问题描述】:

我正在尝试将我的 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 的修饰符范围是什么?
  • @JasonFaulkner admin 被声明为当前表单类中的实例,并且范围设置为 Public

标签: c# mysql winforms datagridview


【解决方案1】:

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

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

private string _id;

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

    // Set the Id for this instance.
    _id = id;
}

现在在您的加载方法中引用_id 变量:

string Query = "SELECT Admin_Com FROM cpr_clients WHERE Client_ID='" + _id + "';";

这增加了在创建frmAdminCommentadmin 对象中检查有效值的负担。

// 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 的情况下一次只选择一行。

【讨论】:

  • 我已经在函数的开头添加了完整的条件,但它仍然只返回 MessageBox 所以它仍然是 null
  • @TobyCook - 对。如果您看到消息框,则表示CurrentRow 为空/未在admin.gridClients 中设置。我更新了答案,包括在创建 frmAdminComment 对象之前检查这一点,以便提醒用户他们需要选择一行。
  • 我知道您来自哪里,但是由于我使用 ContextMenuStrip 作为查看评论的方法,这意味着在打开表单之前已经选择了一行。对不起,如果我把这个复杂化了
  • @TobyCook - 不一定。如果通过右键单击调用上下文菜单,则并不意味着选择了相应的行。只是为了测试,在调用上下文菜单之前左键单击(这将选择行),看看结果是否不同。
  • 我试过你说的,结果和之前一样。如果需要,我可以将我的源文件上传到 pastebin 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多