在 C# 中基于列表动态添加和定位表单项
Dynamically add and position form items based on list in C#
所以我想在我的表单上显示活动列表。
activity class 看起来像:
class Activity
{
public int ID { get; set; }
public int IncidentID { get; set; }
public string Description { get; set; }
public int TimeSpent { get; set; }
public Activity(int iD, int incidentID, string description, int timeSpent)
{
this.ID = iD;
this.IncidentID = incidentID;
this.Description = description;
this.TimeSpent = timeSpent;
}
}
我的最终目标是制作类似这样的模型:
然而,许多活动是在运行时选择的并且可以更改(因为它基于 Incident
,将显示多少活动。
我想出了以下代码来动态填充 GUI:
List<Activity> activities = new List<Activity>();
activities.Add(new Activity(1, 2, "Mail client", 5));
activities.Add(new Activity(2, 2, "Fix problem", 5));
activities.Add(new Activity(3, 2, "Mail client for success", 10));
activities.Add(new Activity(4, 2, "Mail client", 5));
int n = activities.Count();
Label[] labels = new Label[n];
TextBox[] textboxes = new TextBox[n];
CheckBox[] checkboxes = new CheckBox[n];
for (int i = 0; i < n; i++)
{
labels[i] = new Label();
labels[i].Text = activities.ElementAt(i).Description.ToString();
textboxes[i] = new TextBox();
textboxes[i].Text = activities.ElementAt(i).TimeSpent.ToString();
checkboxes[i] = new CheckBox();
}
我的第一个问题是,我们如何将这些组件添加到 GUI 中?我是否有另一个单独的 for
-loop 和布局(或者在我的情况下,group box
)来存储项目?
其次,我怎么可能link带有activity的复选框。这是因为在稍后阶段,我将不得不总结选中复选框的活动的时间。但是他们目前会 link 编辑成 activity 吗?
谢谢
您可以执行以下操作:
1. 在你的 Activities
class 中有静态 StartX
和 StartY
来保持控件坐标并编写 DrawToForm
方法如下:
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public class Activity
{
public int ID { get; set; }
public int IncidentID { get; set; }
public string Description { get; set; }
public int TimeSpent { get; set; }
public static int StartX { get; set; } = 10;
public static int StartY { get; set; } = 10;
public Activity(int iD, int incidentID, string description, int timeSpent)
{
this.ID = iD;
this.IncidentID = incidentID;
this.Description = description;
this.TimeSpent = timeSpent;
}
public void DrawToForm(Form f)
{
var label = new Label();
var textBox = new TextBox();
var checkBox = new CheckBox();
label.Text = Description.ToString();
textBox.Text = TimeSpent.ToString();
label.Left = StartX;
label.Top = StartY;
StartX += 100;// Move position to right
textBox.Left = StartX;
textBox.Top = StartY;
StartX += 150;// Move position to right
checkBox.Left = StartX;
checkBox.Top = StartY;
StartX = 10;// Reset to start
StartY += 50;// Move position to down
f.Controls.Add(label);
f.Controls.Add(textBox);
f.Controls.Add(checkBox);
}
}
}
现在在 Form
的构造函数中,或者无论如何你需要你可以这样做:
public Form1()
{
InitializeComponent();
List<Activity> activities = new List<Activity>();
activities.Add(new Activity(1, 2, "Mail client", 5));
activities.Add(new Activity(2, 2, "Fix problem", 5));
activities.Add(new Activity(3, 2, "Mail client for success", 10));
activities.Add(new Activity(4, 2, "Mail client", 5));
foreach(Activity a in activities)
{
a.DrawToForm(this);
}
}
我没有为 Header 部分写标签,因为它不是动态的。
所以我想在我的表单上显示活动列表。
activity class 看起来像:
class Activity
{
public int ID { get; set; }
public int IncidentID { get; set; }
public string Description { get; set; }
public int TimeSpent { get; set; }
public Activity(int iD, int incidentID, string description, int timeSpent)
{
this.ID = iD;
this.IncidentID = incidentID;
this.Description = description;
this.TimeSpent = timeSpent;
}
}
我的最终目标是制作类似这样的模型:
然而,许多活动是在运行时选择的并且可以更改(因为它基于 Incident
,将显示多少活动。
我想出了以下代码来动态填充 GUI:
List<Activity> activities = new List<Activity>();
activities.Add(new Activity(1, 2, "Mail client", 5));
activities.Add(new Activity(2, 2, "Fix problem", 5));
activities.Add(new Activity(3, 2, "Mail client for success", 10));
activities.Add(new Activity(4, 2, "Mail client", 5));
int n = activities.Count();
Label[] labels = new Label[n];
TextBox[] textboxes = new TextBox[n];
CheckBox[] checkboxes = new CheckBox[n];
for (int i = 0; i < n; i++)
{
labels[i] = new Label();
labels[i].Text = activities.ElementAt(i).Description.ToString();
textboxes[i] = new TextBox();
textboxes[i].Text = activities.ElementAt(i).TimeSpent.ToString();
checkboxes[i] = new CheckBox();
}
我的第一个问题是,我们如何将这些组件添加到 GUI 中?我是否有另一个单独的 for
-loop 和布局(或者在我的情况下,group box
)来存储项目?
其次,我怎么可能link带有activity的复选框。这是因为在稍后阶段,我将不得不总结选中复选框的活动的时间。但是他们目前会 link 编辑成 activity 吗?
谢谢
您可以执行以下操作:
1. 在你的 Activities
class 中有静态 StartX
和 StartY
来保持控件坐标并编写 DrawToForm
方法如下:
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public class Activity
{
public int ID { get; set; }
public int IncidentID { get; set; }
public string Description { get; set; }
public int TimeSpent { get; set; }
public static int StartX { get; set; } = 10;
public static int StartY { get; set; } = 10;
public Activity(int iD, int incidentID, string description, int timeSpent)
{
this.ID = iD;
this.IncidentID = incidentID;
this.Description = description;
this.TimeSpent = timeSpent;
}
public void DrawToForm(Form f)
{
var label = new Label();
var textBox = new TextBox();
var checkBox = new CheckBox();
label.Text = Description.ToString();
textBox.Text = TimeSpent.ToString();
label.Left = StartX;
label.Top = StartY;
StartX += 100;// Move position to right
textBox.Left = StartX;
textBox.Top = StartY;
StartX += 150;// Move position to right
checkBox.Left = StartX;
checkBox.Top = StartY;
StartX = 10;// Reset to start
StartY += 50;// Move position to down
f.Controls.Add(label);
f.Controls.Add(textBox);
f.Controls.Add(checkBox);
}
}
}
现在在
Form
的构造函数中,或者无论如何你需要你可以这样做:public Form1() { InitializeComponent(); List<Activity> activities = new List<Activity>(); activities.Add(new Activity(1, 2, "Mail client", 5)); activities.Add(new Activity(2, 2, "Fix problem", 5)); activities.Add(new Activity(3, 2, "Mail client for success", 10)); activities.Add(new Activity(4, 2, "Mail client", 5)); foreach(Activity a in activities) { a.DrawToForm(this); } }
我没有为 Header 部分写标签,因为它不是动态的。