以另一种形式从列表视图获取值到文本框 C#

get values from listview to textbox in another form C#

我尝试以另一种形式将数据行从列表视图获取到文本框。在我的列表视图中,我只使用了数据库中的两列来显示数据。我使用此代码:

  private void loadStudentList()
    {
        listView1.View = View.Details;
        listView1.Columns.Add("ID");
        listView1.Columns.Add("Name");
        listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
        listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);

        MySqlConnection conn = ConnectionService.getConnection();
        MySqlDataAdapter ada = new MySqlDataAdapter("select * from student", conn);
        DataTable dt = new DataTable();
        ada.Fill(dt);

        for (int i = 0; i < dt.Rows.Count; i++)
        {
            DataRow dr = dt.Rows[i];
            ListViewItem listitem = new ListViewItem(dr["id_student"].ToString());
            listitem.SubItems.Add(dr["name"].ToString());
            listView1.Items.Add(listitem);
        }
    }

item in listview

如果我单击或输入列表视图中包含的项目,它将显示另一种形式。在表单上,​​我想在文本框中显示数据库中的一行,如 id 、 name、 address 和 email 。此代码形式调用另一种形式:

    private void listView1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == 13)
        {
            DetailForm ti = new DetailForm();
            ti.Show();
            e.Handled = true;
        }
    }

like this pic

有没有可以提供解决方案的?谢谢。

这个问题有很多解决方案。通常最简单的方法是调用第二种形式的构造函数,传递你想在那里使用的值。
在您的情况下,ListView 的 ID 值足以构建查询(以第二种形式)以检索所有用户值

private void listView1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == 13)
    {
        if(listView1.SelectedItems.Count > 0)
        {
            string studentID = listView1.SelectedItems[0].Text;
            DetailForm ti = new DetailForm(studentID);
            ti.Show();
            e.Handled = true;
        }
    }
}

现在 DetailForm 应该有一个构造函数来接收传递的 ID

public class DetailForm : Form
{
     public DetailForm(string studentID)
     {
          InitializeComponent();
          // code that retrieves the student details knowing the studentID
          DataTable dt = GetStudentDetails(studentID);
          // code that sets the DetailForm controls with the student details
          if(dt.Rows.Count > 0)
          {
              txtStudentName.Text = dt.Rows[0]["StudentName"].ToString();
              ... and so on ....
          }
          ....
     }
     private DataTable GetStudentDetails(string studentID)
     {
         using(MySqlConnection conn = ConnectionService.getConnection())
         using(MySqlDataAdapter ada = new MySqlDataAdapter("select * from student where id_student = @id", conn))
         {
             ada.SelectCommand.Parameters.Add("@id", MySqlDbType.VarChar).Value = studentID;
             DataTable dt = new DataTable();
             ada.Fill(dt);
             return dt;
         }
    }
}

或者您可以在您的子表单中为您的主列表视图创建一个引用实例,这将使您有可能使用它制作任何您想要的东西,这让我觉得更舒服 :D

在带有列表的主窗体中,您需要放置一个实例,您可以从中访问您的列表视图。就像:

public ListView getMyListView
{
    get{return listView1;}
}

那么在显示 DetailForm 时,您需要将主表单作为参数传递。为此,您需要更改第二种形式的结构,例如: publicDetailForm(主窗体主窗体)

然后,您可以在子表单中创建第二个列表视图,该列表视图将引用第一个列表视图:

ListView g_lvMainListView; 
public DetailForm(MainForm mainForm)
{
    g_lvMainListView = mainForm.getMyListView;//now you already have a bound lsitview to the main list view
    //etc...
}

您最后需要做的就是像这样称呼您的 DetailForm

ti.Show(this);

以便您可以将主窗体作为参数传递。

[编辑 1] 这当然只是一个如何在表单之间传输数据的示例,您可以根据您的具体需求更改代码以最适当的方式满足您的需求。