2012-07-09 132 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

相關問題