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());
}
與按鈕添加標籤和刪除它們與另一個按鈕工作正常,但現在我得到了一些問題:
- comboWorkerType取決於在comboSubsi中選擇什麼diaryTravel。但是在所有動態添加的選項卡中,如果我在comboSubsidiaryTravel中選擇了一個項目,則XML不會加載到comboWorkerType。
- 我如何訪問動態添加的控件及其值如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());
}
}
}
第一個問題解決了。謝謝你:-)但是我不明白你的第二個答案是什麼意思。 'inside'是什麼意思?我讓它們成爲靜態的,以訪問這些DateTime值,這些值可以從我想用這些值計算的另一個類訪問。這不是做這件事的最好方法嗎? – user1414157 2012-07-09 07:37:48
@ user1414157:在這個意義上並沒有使用'static' .. C中使用的'static'與我們在面向對象的世界中使用靜態的方式不同。如果你希望它可以被其他類訪問,使用訪問指定器'public'..'static'將使它靜態 - 不是動態的。 – dotNETbeginner 2012-07-09 08:36:24
由於您將它們設爲靜態,這意味着您沒有爲每個單一用戶控件設置值。請參閱http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx 您還將它們公開,這足以從另一個課程中讀取它們。 – Maarten 2012-07-09 08:38:33