以另一种形式从列表视图获取值到文本框 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);
}
}
如果我单击或输入列表视图中包含的项目,它将显示另一种形式。在表单上,我想在文本框中显示数据库中的一行,如 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;
}
}
有没有可以提供解决方案的?谢谢。
这个问题有很多解决方案。通常最简单的方法是调用第二种形式的构造函数,传递你想在那里使用的值。
在您的情况下,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]
这当然只是一个如何在表单之间传输数据的示例,您可以根据您的具体需求更改代码以最适当的方式满足您的需求。
我尝试以另一种形式将数据行从列表视图获取到文本框。在我的列表视图中,我只使用了数据库中的两列来显示数据。我使用此代码:
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);
}
}
如果我单击或输入列表视图中包含的项目,它将显示另一种形式。在表单上,我想在文本框中显示数据库中的一行,如 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;
}
}
有没有可以提供解决方案的?谢谢。
这个问题有很多解决方案。通常最简单的方法是调用第二种形式的构造函数,传递你想在那里使用的值。
在您的情况下,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] 这当然只是一个如何在表单之间传输数据的示例,您可以根据您的具体需求更改代码以最适当的方式满足您的需求。