显示每个usercontrol文本框中的每条记录

时间:2013-06-03 16:37:39

标签: c# database winforms user-controls dynamic-controls

我创建了一个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?

1 个答案:

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

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

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