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 取决于在 comboSubsidiaryTravel 中选择的内容。但是在所有动态添加的选项卡中,如果我在 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());
        }
}
}
4

1 回答 1

1

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

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

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

于 2012-07-09T06:45:30.560 回答