动态添加标签

时间:2012-07-09 06:35:34

标签: c# winforms tabs

我想在运行时动态添加标签。

我为这些标签创建了一个自己的类:

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?
  3. 格尔茨

    托比

    编辑:

    这是我正在使用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 个答案:

答案 0 :(得分:1)

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

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

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