在 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 中有静态 StartXStartY 来保持控件坐标并编写 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);
        }
    }
}
  1. 现在在 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 部分写标签,因为它不是动态的。