【问题标题】:Display a number of usercontrol based on the number of records in the database根据数据库中的记录数显示多个usercontrol
【发布时间】:2013-06-03 10:43:33
【问题描述】:

。 黑盒子是一个用户控件。

用户控制代码

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

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

显示具有滚动条的用户控件的最佳容器是什么?面板、组框或任何东西?

这必须是示例输出。 .

【问题讨论】:

标签: c# winforms user-controls picturebox


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      • 2014-11-29
      • 2017-02-27
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      • 2017-09-19
      相关资源
      最近更新 更多