我创建了一个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?
答案 0 :(得分:3)
有很多方法可以做到这一点,但最简单的方法是在string
上创建UserControl2
属性并更新该属性的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
}));
同样,这只是众多方法中的一种。我们的想法是将事物逻辑地分组到对象中并传递这些对象。也就是说,设置一个对象优先于设置许多原始值。这样,对象可以在内部控制其所需的字段,它如何响应这些字段,验证数据等,而不必每次都手动记住它。
也许我会在这里切断。根据您的需要,在我的第一个示例中,您只需要从用户控件中公开设置值的某种方式,然后只需设置它即可。如何公开由您自己决定以及如何对象进行逻辑封装。