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

时间:2013-06-03 10:43:34

标签: c# winforms user-controls picturebox

Valid XHTML。 黑匣子是用户控件。

用户控制代码

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

表格代码

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

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

使用上面的代码我可以向usercontrol显示一条记录。我如何根据数据库中的图片和名称显示多个用户控件?例如,我在数据库中有7条记录,表单将显示7个用户控件。当我点击或选择一个用户控件时,会在我的表单中显示更多信息,如地址,联系人等。如果数据库中的记录太多而无法放入表单中,则会有垂直或水平滚动条。给我一些代码:)

显示可以有滚动条的usercontols的最佳容器是什么?面板,组合框或任何其他内容?

这必须是样本输出。 Valid XHTML

2 个答案:

答案 0 :(得分:1)

在我看来,您的案例中最好的容器为FlowLayoutPanel,其FlowDirection属性设置为FlowDirection.LeftToRight。它将特别有用,因为所有自定义用户控件都具有相同的大小(从我在第二个屏幕截图中看到的)。关于你的第一个问题:你可以创建自己的FlowLayoutPanel后代,并添加一些方法,如LoadAllItemsFromDataBase,你可以像现在一样为每条记录创建自定义用户控件,并将其以dinamically方式添加到Controls集合中FlowLayoutPanel

答案 1 :(得分:0)

我们创建的视图非常类似于您所描述的内容。我们有一个Container类,它继承自Form并且是自定义绘制的(它实际上是一个abstract类,我们进一步继承它们以创建所有共享通用功能的容器类型)。我们将这些Containers动态地添加到Panel控件中,基于循环访问数据库中的记录以检索有关如何构造Containers的信息。作为自己的类意味着您可以为您选择的任何事件提供自定义处理程序,例如对用户选择做出反应(以获取地址和联系人等更多信息)。

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

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

一旦你有一个容器类和一个带有Panel的表单,你就可以遍历从数据库中检索的记录,为每个记录添加一个容器对象,并同时设置它们的值(基于例子,一些文字和一个图像)。