C# WinForm 自定义网格布局

C# WinForm custom grid layout

我需要创建一个具有如下自定义布局的对象列表:

你能告诉我如何在 winform c# 应用程序中实现它吗? 注意数据不能直接从数据库绑定,需要填写代码

谢谢

您可以使用以下控件来实现您想要的效果:

  • FlowLayoutPanel
  • Panel
  • TextBox
  • PictureBox
  • Button

使用 FlowLayoutPanel 自动排列控件。

我建议创建一个 windows 表单用户控件来制作输入表单,然后将其添加到 FlowLayoutPanel

在用户控件中,您可以使用 Panel 在其中放置以下控件:

  • TextBox for 'RTL label', 'LTR label', 'Number', 'Text label'.

  • PictureBox 对于 'Picture'.

  • Button 用于按钮。

    这里是 link 如何创建 windows 表单用户控件。

Wael 的回答确实向您展示了推荐的方法:创建一个 UserControl 并将其添加到 FlowLayoutPanelTableLayoutPanel.

关于 UserControls 的一件事确实需要注意:您添加到其中的所有控件都是 private 并且无法轻易访问,即使您添加了UC 到设计器中的 Form..

因此您应该将它们的修饰符更改为 public 或(推荐)创建一组不错的接口例程,最好使用 Properties 或方法来填充内容。

这是一个小例子,向您展示如何做到这一点:

如您所见,我只添加了两个 Labels、一个 TextBox、一个 PictureBox 和一个 Button

这是访问例程的代码;我写它是为了展示几个变体..

它利用了几个属性,一个是完整的,一个是read-only,一个是自动的。还有一个加载例程,超载,最后一个代表负责 Button 次点击..:[=​​29=]

public partial class InfoBox : UserControl
{
    public InfoBox()
    {
        InitializeComponent();
        TextBox1 = textBox1;   // hook up the automatic property
    }

    public string Label1Text    // two-way, fully hooked-up
    {
        get { return label1.Text; }
        set { label1.Text = value; }
    }

    public string Label2Text   {  get { return label2.Text; }   } // read-only

    public TextBox TextBox1 {  get; set;  }  // automatic

    public void LoadImage(Image img)
    {
        pictureBox1.Image = img;
        if (img != null) label2.Text = img.Width + "x" + img.Height;
        else label2.Text = "no image loaded.";
    }

    public void LoadImage(string imageFileName)
    {
        LoadImage(Image.FromFile(imageFileName));
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (Button1Click != null) Button1Click(this);
    }

    public Button1Click Button1Click { private get; set; }

}

public delegate void Button1Click(InfoBox ibox);

请注意,委托类型是在 class 之外定义的,因此我们仍然可以直接从其他地方看到它。

另请注意,自动属性实际上是暴露了整个TextBox,而不是仅与其Text属性挂钩!再次:这是为了展示各种可能性..

这是一个示例,说明如何将一个这样的信息框加载到 FlowLayoutPanel 并设置其内容和 Button 操作:

private void Form1_Load(object sender, EventArgs e)
{
    InfoBox aBox = new InfoBox();
    aBox.TextBox1.Text = "<Comment>";
    aBox.LoadImage("D:\stop32.png");  // some image file
    aBox.Button1Click = myButton1Action;

    flowLayoutPanel1.Controls.Add(aBox);
}

void myButton1Action (InfoBox box)
{
    Console.WriteLine(box.Label2Text);

}