【问题标题】:get values from listview to textbox in another form C#以另一种形式C#从listview获取值到文本框
【发布时间】:2016-06-06 18:36:11
【问题描述】:

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

  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

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

【问题讨论】:

  • 您的地址和电子邮件存储在哪里?那些没有显示在你的代码中?您可以执行新的 SQL 查询来获取这些值,也可以将它们包含到您的数据表中并从那里获取它们...
  • @kyle_engineer 电子邮件和地址在“学生”表中。带有 id 和 name 的 inrow。

标签: c# mysql .net textbox listviewitem


【解决方案1】:

这个问题有很多解决方案。通常最简单的方法是调用第二种形式的构造函数,传递您要在其中使用的值。
在您的情况下,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;
         }
    }
}

【讨论】:

  • 不,在 DetailForm 中,您会收到从第一个表单中提取的 studentID。您无需尝试访问 ListVIew,而是执行 ADO.NET 命令,使用接收到的 studentID 作为搜索的主键从数据库中检索数据。
  • 感谢您提供的示例。对我很有帮助。我已经尝试过了,但是当按下回车按钮时,int idBarang = Convert.ToInt32(listView1.SelectedItems[0].Text); 上出现“FormatException was unhandled”; .我错过了什么吗?
  • 我想 student_id 是一个数字。我的意思是您的列表视图的第一列包含一个数字?
  • 在我的数据库中有 5 列“数字”、“学生 ID”、“姓名”、“地址”和“电子邮件”。第一个表是“数字”列,我使用 int 类型和 auto_increments。我的列表视图只显示学生 ID 和姓名的 2 列。 student_id 使用 varchar 类型,因为我想用随机字符制作 student_id。
  • 当然 student_id 列中的值应该是唯一的(这意味着没有学生与另一个学生具有相同的 student_id)。如果是这种情况,那么我们需要在上面的代码中更改一些数据类型
【解决方案2】:

或者你可以在你的子表单中为你的主列表视图创建一个引用实例,这样你就可以用它做任何你想做的事情,这使得 IMO 更舒服:D

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

public ListView getMyListView
{
    get{return listView1;}
}

然后在显示DetailForm 时,您需要将主表单作为参数传递。为此,您需要更改第二种形式的结构,例如: public DetailForm(MainForm mainForm)

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

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] 这当然只是一个如何在表单之间传输数据的示例,您可以根据您的需求更改代码以最适当的方式满足您的需求。

【讨论】:

  • 我的印象是 ListView 不包含 DetailForm 所需的所有字段。 OP 说他有两列 ID 和 Name。因此,允许访问 ListView(除了不好的 OOP 实践)并不能解决问题。但我可能是错的。
  • 可能是。我只是建议使用 ListView 作为如何在表单之间传输数据的示例。当然,他可以更改代码并检索访问数据库所需的数据并完成所需的操作。这取决于他,重点是,他可以知道如何在表单之间传递他的数据,这就是 IMO 的主题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多