基于C#中的列表动态添加和定位表单项目#

问题描述:

所以我试图显示我的表单上的活动列表。基于C#中的列表动态添加和定位表单项目#

Activity类的样子:

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

    } 

我的最终目标是有这样的事情实物模型:

enter image description here

了一系列的活动,但是,选择在运行时可以改变(因为它基于Incident,将显示多少活动。)

我已经拿出了这个foll由于代码动态填充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)来存储项目?

其次,我怎么可能将复选框与活动链接。这是因为在稍后阶段,我将不得不总结检查其复选框的活动时间。但他们目前是否与一项活动相关联?

感谢

你可以做到以下几点:
1.在Activities类具有静态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); 
        } 
    } 
    

    我还没有写标题部分的标签部分,因为它不是动态的。

开始=”>
+0

非常感谢!我想知道“CheckBox”问题,在“Activity”类中添加一个CheckBox作为成员是否更好? –

+0

@KahnKah如果您将该复选框值保存到数据库或文件系统,然后使用“活动”类从那里加载它,那么您当然需要为该复选框设置属性或字段。 –

+0

非常感谢S.Petrosov –