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
并将其添加到 FlowLayoutPanel
或 TableLayoutPanel
.
关于 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);
}
我需要创建一个具有如下自定义布局的对象列表:
你能告诉我如何在 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
并将其添加到 FlowLayoutPanel
或 TableLayoutPanel
.
关于 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);
}