C# winform usercontrols之间的通信以将tab添加到tabcontrol
我想在单击按钮后添加一个选项卡页。对我来说,困难在于我用按钮得到了一个UserControl,而tabpage是一个UserControl,我想用TabControl将它添加到现有的UserControl中 下面是我要添加的选项卡的Usercontrol:C# winform usercontrols之间的通信以将tab添加到tabcontrol,c#,user-controls,tabcontrol,dynamically-generated,C#,User Controls,Tabcontrol,Dynamically Generated,我想在单击按钮后添加一个选项卡页。对我来说,困难在于我用按钮得到了一个UserControl,而tabpage是一个UserControl,我想用TabControl将它添加到现有的UserControl中 下面是我要添加的选项卡的Usercontrol: using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; usi
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
namespace Demo
{
public partial class TabsTravel : 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 TabsTravel()
{
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";
comboSubsidiaryTravel.SelectedIndexChanged += new EventHandler(comboSubsidiaryTravel_SelectedIndexChanged);
}
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;
}
}
}
这是我得到TabControl的Usercontrol
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MBG.SimpleWizard;
using System.Globalization;
namespace Demo
{
public partial class Page3 : UserControl, IWizardPage
{
int c = 1;
private static DateTime WorkStart;
public DateTime workStart
{
get { return WorkStart; }
set { WorkStart = value; }
}
private static DateTime WorkEnd;
public DateTime workEnd
{
get { return WorkEnd; }
set { WorkEnd = value; }
}
public Page3()
{
InitializeComponent();
dtpWorkStart.Format = DateTimePickerFormat.Custom;
dtpWorkStart.CustomFormat = "ddd dd MMM yyyy hh:mm";
dtpWorkEnd.Format = DateTimePickerFormat.Custom;
dtpWorkEnd.CustomFormat = "ddd dd MMM yyyy hh:mm";
}
#region IWizardPage Members
public UserControl Content
{
get { return this; }
}
public new void Load()
{
}
public void Save()
{
}
public void Cancel()
{
throw new NotImplementedException();
}
public bool IsBusy
{
get { throw new NotImplementedException(); }
}
public bool PageValid
{
get { return true; }
}
public string ValidationMessage
{
get { throw new NotImplementedException(); }
}
#endregion
private void dtpWorkStart_ValueChanged(object sender, EventArgs e)
{
workStart = dtpWorkStart.Value;
dtpWorkStart.MinDate = dtpWorkEnd.Value;
}
private void dtpWorkEnd_ValueChanged(object sender, EventArgs e)
{
workEnd = dtpWorkEnd.Value;
}
private void button1_Click(object sender, EventArgs e)
{
dataGridView1.DataSource = GetTable();
if (c == 1)
{
DataGridViewCheckBoxColumn chk = new DataGridViewCheckBoxColumn();
dataGridView1.Columns.Add(chk);
chk.HeaderText = "Holiday";
chk.Name = "Holiday";
}
c++;
}
public static DataTable GetTable()
{
DataTable table = new DataTable();
DateTime test = new DateTime();
DateTime test2 = new DateTime();
CultureInfo culture = CultureInfo.CurrentCulture;
int week = 0;
test = WorkStart;
table.Columns.Add("Calendarweek", typeof(int));
table.Columns.Add("Day", typeof(string));
table.Columns.Add("Date", typeof(DateTime));
table.Columns.Add("Start work", typeof(string));
table.Columns.Add("End work", typeof(string));
table.Columns.Add("Total", typeof(TimeSpan));
while (test <= WorkEnd)
{
test2 = test;
test2 = test2.AddHours(10);
if (test.DayOfWeek != DayOfWeek.Sunday)
{
week = culture.Calendar.GetWeekOfYear(test, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
table.Rows.Add(week, test.DayOfWeek.ToString(), test.ToString("dd MMM"), test.ToString("hh:mm tt", CultureInfo.InvariantCulture), test2.ToString("hh:mm tt", CultureInfo.InvariantCulture), test2 - test);
}
test = test.AddDays(1);
//table.Rows.Add();
}
//Zugriff auf Zelle zuerst zeile dann spalte
//string testString = table.Rows[3][2].ToString();
table.RowChanged += new DataRowChangeEventHandler(table_RowChanged);
//MessageBox.Show(testString);
return table;
}
static DataRow getRow(DataTable table)
{
DataRow row = table.NewRow();
return row;
}
static void table_RowChanged(object sender, DataRowChangeEventArgs e)
{
//e.Row.AcceptChanges();
//throw new StackOverflowException();
//throw new NotImplementedException();
}
private void button2_Click(object sender, EventArgs e)
{
}
}
}
这里我得到了UserControl A中的按钮和addTab方法:
public delegate void tabWork(TabControl tabsWork);
private void btnAddWorker_Click(object sender, EventArgs e)
{
addTab(tabsTravel);
}
static void addTab(TabControl tabsTravel)
{
string title = "worker " + (tabsTravel.TabCount + 1).ToString();
TabPage travel = new TabPage();
tabWork work;
tabsTravel.TabPages.Add(travel);
travel.Text = title;
travel.BackColor = Color.White;
travel.Controls.Add(new TabsTravel());
work = new tabWork(Page3.addTab);
}
这里我得到了UserControl B中的addTab方法:
public static void addTab(TabControl tabsWork)
{
TabsWork work = new TabsWork();
TabPage Tabwork = new TabPage();
string title = "worker " + (tabsWork.TabCount + 1).ToString();
tabsWork.TabPages.Add(Tabwork);
Tabwork.Text = title;
Tabwork.BackColor = Color.White;
Tabwork.Controls.Add(new TabsWork());
}
但是UserControl B中的addTab从未被调用
我如何解决这个问题?你应该创建一个事件,通知另一个用户控件创建/添加另一个选项卡,传递一个对象,其中包含你想在另一个用户控件中获得的信息,而我对C“非常陌生”#你能给我一个例子吗?看看这里,研究一下,因为你将更多地作为一个程序员使用它,好吗现在谢谢你。如果我有什么问题,我会回来的。你能再给我一个提示吗?
public static void addTab(TabControl tabsWork)
{
TabsWork work = new TabsWork();
TabPage Tabwork = new TabPage();
string title = "worker " + (tabsWork.TabCount + 1).ToString();
tabsWork.TabPages.Add(Tabwork);
Tabwork.Text = title;
Tabwork.BackColor = Color.White;
Tabwork.Controls.Add(new TabsWork());
}