0

我创建了一个用户控件(用户控件2)并在用户控件(用户控件2)上添加了文本框。

表格代码:

 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 条记录。

现在,如何在每个用户控件的文本框中显示每个姓氏?

4

1 回答 1

3

有很多方法可以做到这一点,但最简单的可能是在该属性的设置器中创建一个string属性UserControl2并更新文本框。像这样的东西:

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
        }));

同样,这只是众多方法中的一种。这个想法是在逻辑上将事物分组为对象并传递这些对象。也就是说,设置一个对象优于设置许多原始值。这样,对象可以在内部控制其所需字段、它如何响应这些字段、数据验证等,而不必每次都手动记住要这样做。

也许我要在这里切线了。根据您的需要,就像在我的第一个示例中一样,您只需要从用户控件中公开一些设置值的方式,然后进行设置。如何公开它取决于您以及您的对象如何在逻辑上封装。

于 2013-06-03T16:56:36.967 回答