2012-07-09 134 views
0

我想在运行时动态添加选项卡。动态添加选项卡

我做了一个自己的类的标签是这样的:

namespace Demo 
{ 
    public partial class Tabs : UserControl 
    { 
     private static DateTime ArrivalStart; 
     public static DateTime arrivalStart 
     { 
      get { return ArrivalStart; } 
      set { ArrivalStart = value; } 

     } 

     private static DateTime ArrivalEnd; 
     public static DateTime arrivalEnd 
     { 
      get { return ArrivalEnd; } 
      set { ArrivalEnd = value; } 

     } 

     private static DateTime DepartureStart; 
     public static DateTime departureStart 
     { 
      get { return DepartureStart; } 
      set { DepartureStart = value; } 

     } 

     private static DateTime DepartureEnd; 
     public static DateTime departureEnd 
     { 
      get { return DepartureEnd; } 
      set { DepartureEnd = value; } 

     } 

     public Tabs() 
     { 
      InitializeComponent(); 
      LoadSubsidiaryXML(); 
      dtpArrivalStart.Format = DateTimePickerFormat.Custom; 
      dtpArrivalStart.CustomFormat = "ddd dd MMM yyyy hh:mm"; 
      dtpArrivalEnd.Format = DateTimePickerFormat.Custom; 
      dtpArrivalEnd.CustomFormat = "ddd dd MMM yyyy hh:mm"; 
      dtpDepartureStart.Format = DateTimePickerFormat.Custom; 
      dtpDepartureStart.CustomFormat = "ddd dd MMM yyyy hh:mm"; 
      dtpDepartureEnd.Format = DateTimePickerFormat.Custom; 
      dtpDepartureEnd.CustomFormat = "ddd dd MMM yyyy hh:mm"; 
     } 

     private void LoadSubsidiaryXML() 
     { 
      XmlDocument subsidiary = new XmlDocument(); 
      subsidiary.Load("Subsidiaries.xml"); 

      XmlNodeList Subname = subsidiary.SelectNodes("subsidiaries/type/name"); 
      foreach (XmlNode name in Subname) 
      { 
       comboSubsidiaryTravel.Items.Add(name.InnerText); 
      } 
     } 

     private void LoadWorkerXML(string xmlType) 
     { 
      comboWorkerType.Items.Clear(); 
      XmlDocument workerType = new XmlDocument(); 
      workerType.Load(xmlType); 

      XmlNodeList worker = workerType.SelectNodes("worker/type/name"); 
      foreach (XmlNode name in worker) 
      { 
       comboWorkerType.Items.Add(name.InnerText); 
      } 
     } 

     //Select XML which have to be populated to comboWorkerType 
     private void chooseWorker() 
     { 
      string xmlType = ""; 
      string subsidiary = ""; 
      subsidiary = comboSubsidiaryTravel.Text; 
      switch (subsidiary) 
      { 
       case "GH": 
        xmlType = "GHworkerType.xml"; 
        LoadWorkerXML(xmlType); 
        break; 

       case "GP": 
        xmlType = "GPworkerType.xml"; 
        LoadWorkerXML(xmlType); 
        break; 

       case "GN": 
        xmlType = "GNworkerType.xml"; 
        LoadWorkerXML(xmlType); 
        break; 

       case "GT": 
        xmlType = "GTworkerType.xml"; 
        LoadWorkerXML(xmlType); 
        break; 
       case "GS": 
        xmlType = "GSworkerType.xml"; 
        LoadWorkerXML(xmlType); 
        break; 

       case "GK": 
        xmlType = "GKworkerType.xml"; 
        LoadWorkerXML(xmlType); 
        break; 

       case "GBH": 
        xmlType = "GBHworkerType.xml"; 
        LoadWorkerXML(xmlType); 
        break; 

       case "GAS": 
        xmlType = "GASworkerType.xml"; 
        LoadWorkerXML(xmlType); 
        break; 

       case "Others": 
        comboWorkerType.Items.Clear(); 
        break; 
       default: 
        break; 
      } 
     } 

     private void comboSubsidiaryTravel_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      chooseWorker(); 
     } 

     private void dtpArrivalStart_ValueChanged(object sender, EventArgs e) 
     { 
      ArrivalStart = dtpArrivalStart.Value; 
      dtpArrivalEnd.MinDate = dtpArrivalStart.Value; 
     } 

     private void dtpArrivalEnd_ValueChanged(object sender, EventArgs e) 
     { 
      ArrivalEnd = dtpArrivalEnd.Value; 
      dtpDepartureStart.MinDate = dtpArrivalEnd.Value; 
     } 

     private void dtpDepartureStart_ValueChanged(object sender, EventArgs e) 
     { 
      DepartureStart = dtpDepartureStart.Value; 
      dtpDepartureEnd.MinDate = dtpDepartureStart.Value; 
     } 

     private void dtpDepartureEnd_ValueChanged(object sender, EventArgs e) 
     { 
      DepartureEnd = dtpDepartureEnd.Value; 
     } 
    } 
} 

,我加入一个按钮一个新的选项卡:

private void btnAddWorker_Click(object sender, EventArgs e) 
     { 
      string title = "worker " + (tabsTravel.TabCount + 1).ToString(); 

      TabPage test = new TabPage(); 

      tabsTravel.TabPages.Add(test); 
      test.Text = title; 
      test.BackColor = Color.White; 
      test.Controls.Add(new Tabs()); 

     } 

与按钮添加标签和删除它们与另一个按钮工作正常,但现在我得到了一些问题:

  1. comboWorkerType取决于在comboSubsi中选择什么diaryTravel。但是在所有动态添加的选项卡中,如果我在comboSubsidiaryTravel中选择了一个项目,则XML不会加载到comboWorkerType。
  2. 我如何访问动态添加的控件及其值如datetimepicker?

格尔茨

托比

编辑:

这就是我使用的DateTimePicker的值类:

namespace Demo 
{ 
    class worker 
    { 
     public void ArrivalTimeSpan() 
     { 
      TimeSpan Arrival = new TimeSpan(); 

      Arrival = Page2.arrivalEnd - Page2.arrivalStart; 
      System.Windows.Forms.MessageBox.Show(Arrival.ToString()); 
     } 

     public void DepartureTimeSpan() 
     { 
      TimeSpan Departure = new TimeSpan(); 

      Departure = Page2.departureEnd - Page2.departureStart; 
      System.Windows.Forms.MessageBox.Show(Departure.ToString()); 
     } 

     public void WorkTimeSpan() 
     { 
      TimeSpan Work = new TimeSpan(); 

      Work = Page3.workEnd - Page3.workStart; 
      System.Windows.Forms.MessageBox.Show(Work.ToString()); 
     } 
} 
} 

回答

1

A1:我的确看到事件处理程序方法,但我没有看到实际将事件连接到事件处理程序的一行代码。例如。 comboSubsidiaryTravel.SelectedIndexChanged + = comboSubsidiaryTravel_SelectedIndexChanged

A2:你不能直接。您必须检查Controls集合属性才能找到它们。除非你在用户控制之内,否则你可以直接访问它们。

我看到一个主要的基本错误如下:您的用户控件中的DateTime变量是静态的!我很确定这不是你想要的,你通常需要实例化属性。你还有什么要保持价值观独立?

+0

第一个问题解决了。谢谢你:-)但是我不明白你的第二个答案是什么意思。 'inside'是什么意思?我让它们成为静态的,以访问这些DateTime值,这些值可以从我想用这些值计算的另一个类访问。这不是做这件事的最好方法吗? – user1414157 2012-07-09 07:37:48

+0

@ user1414157:在这个意义上并没有使用'static' .. C中使用的'static'与我们在面向对象的世界中使用静态的方式不同。如果你希望它可以被其他类访问,使用访问指定器'public'..'static'将使它静态 - 不是动态的。 – dotNETbeginner 2012-07-09 08:36:24

+0

由于您将它们设为静态,这意味着您没有为每个单一用户控件设置值。请参阅http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx 您还将它们公开,这足以从另一个课程中读取它们。 – Maarten 2012-07-09 08:38:33

相关问题