C# 根据数据库中的记录数显示多个usercontrol

C# 根据数据库中的记录数显示多个usercontrol,c#,winforms,user-controls,picturebox,C#,Winforms,User Controls,Picturebox,。 黑盒是一个用户控件 用户控制代码 string b = ""; public string ID { set { b = value; } } public void sample() { textBox1.Clear(); using (SqlConnection myDatabaseConnection = new SqlConnection(myConnectionString.Connecti

。 黑盒是一个用户控件

用户控制代码

 string b = "";
    public string ID
    {
        set { b = value; }
    }

    public void sample()
    {
        textBox1.Clear();
        using (SqlConnection myDatabaseConnection = new SqlConnection(myConnectionString.ConnectionString))
        {
            myDatabaseConnection.Open();
            using (SqlCommand SqlCommand = new SqlCommand("Select LastName, Image from Employee where ID = @a", myDatabaseConnection))
            {
                SqlCommand.Parameters.AddWithValue("@a", b);
                DataSet DS = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter(SqlCommand);
                da.Fill(DS, "Images");
                var imagesTable = DS.Tables["Images"];
                var imagesRows = imagesTable.Rows;
                var count = imagesRows.Count;

                if (count <= 0)
                    return;
                var imageColumnValue =
                    imagesRows[count - 1]["Image"];
                if (imageColumnValue == DBNull.Value)
                    return;

                var data = (Byte[])imageColumnValue;
                using (var stream = new MemoryStream(data))
                {
                    pictureBox1.Image = Image.FromStream(stream);
                }

            }
        }   
    }

    public void getname()
    {
        using (SqlConnection myDatabaseConnection = new SqlConnection(myConnectionString.ConnectionString))
        {
            myDatabaseConnection.Open();
            using (SqlCommand SqlCommand = new SqlCommand("Select LastName from Employee where ID =  @a", myDatabaseConnection))
            using (SqlDataAdapter da = new SqlDataAdapter(SqlCommand))
            {
                SqlCommand.Parameters.AddWithValue("@a", b);

                SqlDataReader DR1 = SqlCommand.ExecuteReader();
                if (DR1.Read())
                {
                    textBox1.Text = DR1.GetString(DR1.GetOrdinal("LastName")).ToString();
                }
            }
        }
    }
使用上面的代码,我可以向usercontrol显示一条记录。如何根据数据库中的记录数及其图片和名称显示多个usercontrol?例如,我在数据库中有7条记录,表单将显示7个usercontrols。当我点击或选择一个用户控件时,更多信息,如地址、联系人等将显示在我的表单中。如果数据库中的记录太多,无法放入表单,则会出现垂直或水平滚动条。给我一些代码:)

显示可以有滚动条的UserControl的最佳容器是什么?一个面板,一个分组框还是什么

这必须是示例输出。
.

在我看来,您最好的容器是
FlowLayoutPanel
,其
FlowDirection
属性设置为
FlowDirection.LeftToRight
。它将特别有用,因为您的所有自定义用户控件都具有相同的大小(从我在您的第二个屏幕截图中看到的)。关于您的第一个问题:您可以创建自己的
FlowLayoutPanel
的后代,并从数据库中添加一些方法,如LoadAllItems,您可以像现在一样为每个记录创建自定义用户控件,并将其手动添加到
FlowLayoutPanel
集合中查看与您描述的内容非常相似的内容。我们有一个
容器
类,它继承自
表单
,并且是自定义绘制的(它实际上是一个
抽象的
类,我们从中进一步继承,以创建许多类型的容器,这些容器都共享公共功能)。我们将这些
容器
动态添加到
面板
控件中,这是基于在数据库中循环记录以检索有关如何构造
容器
的信息。作为它自己的类意味着您可以为您选择的任何事件使用自定义处理程序,例如对用户选择作出反应(以获取更多信息,如地址和联系人)

在您的示例中,我没有看到您称之为“UserControl”的类。我建议从那里开始。定义“容器”对象的具体类将锚定此项目

在上一个屏幕截图中,红色轮廓应该是
面板
控件<代码>面板将允许滚动。或者,如果希望拥有容器的控件控制位置和间距,也可以使用
FlowLayoutControl
。我们使用了
面板
,以保持对绝对定位的控制

一旦您拥有一个容器类和一个带有
面板的表单,您就可以在从数据库检索的记录中循环,为每个记录添加一个容器对象,并同时设置其值(基于示例,一些文本和图像)

public string ID
    {
        get { return textBox1.Text; }
    }

        private void textBox1_TextChanged(object sender, EventArgs e)
    {
        userControl21.ID = ID;
        userControl21.sample();
        userControl21.getname();
    }