显示每个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数据等,而不必每次都手动记住这样做。

也许我会在这里切断。 根据您的需要,如在我的第一个示例中,您只需要从用户控件中公开设置值的某种方式,然后只需设置它。 如何公开由您自己决定以及如何对象进行逻辑封装。