2016-01-23 234 views
-1

我需要创建对象的列表,有一个自定义布局是这样的: Custom grid layoutC#WinForm的自定义网格布局

请你告诉我何来实现它在WinForm C#应用程序? 请注意,数据无法直接从数据库绑定,因此应该填入代码。

感谢

+0

创建一个用户控件用填充元素的公共方法,如果你需要它,委托按钮调用.. – TaW

回答

1

瓦埃勒的答案确实给你的推荐方法:创建一个UserControl和它要么添加到FlowLayoutPanel或一个TableLayoutPanel

一件事UserControls确实需要一些注意:您添加的所有控制它是私人并不能很容易地访问,甚至当你添加UC在设计师Form ..

所以你应该改变它们的修饰符为public或者(推荐)创建一组不错的接口例程,最好使用Properties或者使用方法来填充内容..

下面是一个小例子,向您展示如何这可以做到:

enter image description here

正如你可以看到我只有两个Labels有加,一个TextBox,一个PictureBoxButton

这里是访问例程的代码;我已经写了它来显示几个变化..

它使用几个属性,一个完整的,一个只读和一个自动。也装载常规,超负荷的最后一个委托照顾Button点击..:

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

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

另外请注意,自动属性实际上是暴露整个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); 

} 
2

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

  • FlowLayoutPanel
  • Panel
  • TextBox
  • PictureBox
  • Button

使用FlowLayoutPanel自动排列控件。

我建议创建一个windows窗体用户控件,使输入窗体然后将其添加到FlowLayoutPanel

在用户的控制,你可以使用Panel放置里面以下控件:

  • TextBox为“RTL标签”,“LTR标签”,“数”,“文字标签”。
  • PictureBox for'Picture'。
  • Button按钮。

    这里是关于如何创建一个Windows窗体用户控件的link