我尝试将listview中的数据行以另一种形式获取到文本框。在我的listview中,我只使用数据库中的两列来显示数据。我使用这段代码:
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);
}
}
如果我点击或输入listview中包含的项目,它将显示另一个表单。在表单上我想显示我的数据库中的一行,如文本框中的ID,名称,地址和电子邮件。这段代码形式称为另一种形式:
private void listView1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 13)
{
DetailForm ti = new DetailForm();
ti.Show();
e.Handled = true;
}
}
有没有可以提供解决方案?谢谢。
答案 0 :(得分:0)
这个问题有很多解决方案。通常最简单的方法是调用第二种形式的构造函数传递你想要在那里使用的值 在您的情况下,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;
}
}
}
答案 1 :(得分:0)
或者您可以在子表单中为主列表视图创建一个参考实例,这样您就可以随心所欲地制作任何内容,这样会更加舒适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] 这只是一个如何在表单之间传输数据的示例,您可以根据您的要求,以最恰当的方式更改代码以满足您的需求。