显示每个usercontrol文本框中的每条记录
我创建一个usercontrol(usercontrol2)并在usercontrol(usercontrol2)上添加textBox。
表格代码:
using (SqlConnection myDatabaseConnection = new SqlConnection(myConnectionString.ConnectionString)) { myDatabaseConnection.Open(); using (SqlCommand SqlCommand = new SqlCommand("Select LastName from Employee", myDatabaseConnection)) using (SqlDataAdapter da = new SqlDataAdapter(SqlCommand)) { SqlDataReader DR1 = SqlCommand.ExecuteReader(); int y = 0; while (DR1.Read()) { y++; for (int i = 0; i < y; i++) { UserControl2 userconrol = new UserControl2(); userconrol.Location = new Point(50, 30 * i); userconrol.Tag = i; this.Controls.Add(usercontrol); } } } }
使用上面的代码,我的表单显示20个用户控件,因为我的表包含20个记录。
现在,如何在每个usercontrols的文本框中显示每个LastName?
有很多方法可以做到这一点,但最简单的可能是在UserControl2
上创建一个string
属性并更新该属性的setter中的文本框。 像这样的东西:
private string lastName; public string LastName { get { return lastName; } set { lastName = value; lastNameTextBox.Text = value; } }
然后在上面的代码中你会做这样的事情:
UserControl2 userconrol = new UserControl2(); userconrol.Location = new Point(50, 30 * i); userconrol.Tag = i; userconrol.LastName = (string)DR1["LastName"]; this.Controls.Add(usercontrol);
(你可能想要围绕该演员进行一些错误检查,确保那里有一个值,什么不是。)
但是,随着更多字段的添加,这不能很好地扩展。 您必须记住在添加此用户控件的任何位置更新此相同代码。 您可以通过为用户控件创建视图模型来更进一步。 鉴于我们到目前为止的领域,这将是这样的:
public class EmployeeViewModel { public string LastName { get; set; } public Point Location { get; set; } public int Tag { get; set; } }
您可以通过将其添加到构造函数中来在用户控件中要求此视图模型:
public UserControl2(EmployeeViewModel model) { this.Location = model.Location; this.Tag = model.Tag; this.LastName = model.LastName; }
因此,每当您创建UserControl2
的新实例时,编译器都会强制您为其提供所需的数据:
this.Controls.Add( new UserControl2( new EmployeeViewModel { LastName = (string)DR1["LastName"], Location = new Point(50, 30 * i), Tag = i }));
同样,这只是众多方法中的一种。 我们的想法是将事物逻辑地分组到对象中并传递这些对象。 也就是说,设置一个对象优先于设置许多原始值。 这样,对象可以在内部控制其所需的字段,它如何响应这些字段,validation数据等,而不必每次都手动记住这样做。
也许我会在这里切断。 根据您的需要,如在我的第一个示例中,您只需要从用户控件中公开设置值的某种方式,然后只需设置它。 如何公开由您自己决定以及如何对象进行逻辑封装。