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