none
winform tabControl加载同一个控件保存问题 RRS feed

  • 问题

  • 问题是这样的:在一个窗体(From1)上有一个tabControl(tabMain)和一个button(btSave),

    tabMain(后台代码加载tabPage)有tabPage0,tabPage1,tabpage2,,3个页面,3个页面加载同一个用户控件 userControl1(比如说这个用户控件只用一个TextBox(txtName)),

    然后运行程序后,我在tabPage0的txtName写上文字(比如是a),我在tabPage1的txtName写上文字(比如是b),我在tabPage2的txtName写上文字(比如是c),然后按btSave保存,怎么样一次性 得到这3个值(a,b,c),

    希望高手帮帮忙啊。。

    Form1.cs:

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                 //DataTable ds = SetParamClass.XmlFileToDataTable();
                //for (int i = 0; i < ds.Rows.Count; i++)           
                for (int i = 0; i < 3; i++)
                {
                    this.tabMain.TabPages.Add(i.ToString(),"tabPage"+i.ToString());
                   
                    this.tabMain.TabPages[i].Controls.Add(new UserControl1());

                }
            }

            private void btSave_Click(object sender, EventArgs e)
            {
                string result= new UserControl1().GetValue();
                MessageBox.Show(result);
            }
        }

            private void btSave_Click(object sender, EventArgs e)
            {
                string result= new UserControl1().GetValue();
                MessageBox.Show(result); //这个值怎么一次性得到,而且是3 个 ??
            }

     

    UserControl1.cs:

    public partial class UserControl1 : UserControl
        {
            public UserControl1()
            {
                InitializeComponent();
               
            }
            public string GetValue()
            {
                string returnValue = this.txtName.Text;
                return returnValue;
            }
        }

    2010年5月15日 3:02

答案

  • 你好!

         我谈谈我的个人看法啊!可能不成熟,但是希望对你有帮助:

         1,在UserControl1的定义中,通过属性来暴露这个值,而不是通过GetValue方法

         2, 如果你按这个方法,获取不到这个值的:

             private void btSave_Click(object sender, EventArgs e)
            {
                string result= new UserControl1().GetValue();  //这里是新初始化的UserControl1实例,并非添加到TabPage中的那个实例,所以这样只能获取到txtName的初始值,如果你没有特意设置,通常是空!
                MessageBox.Show(result);
            }

         3,说去三个值没有太简单的方法,只能通过循环分别来获取!


    周雪峰
    • 已标记为答案 Csharpzero 2010年5月20日 5:21
    2010年5月15日 12:28
    版主

全部回复

  • 你好!

         我谈谈我的个人看法啊!可能不成熟,但是希望对你有帮助:

         1,在UserControl1的定义中,通过属性来暴露这个值,而不是通过GetValue方法

         2, 如果你按这个方法,获取不到这个值的:

             private void btSave_Click(object sender, EventArgs e)
            {
                string result= new UserControl1().GetValue();  //这里是新初始化的UserControl1实例,并非添加到TabPage中的那个实例,所以这样只能获取到txtName的初始值,如果你没有特意设置,通常是空!
                MessageBox.Show(result);
            }

         3,说去三个值没有太简单的方法,只能通过循环分别来获取!


    周雪峰
    • 已标记为答案 Csharpzero 2010年5月20日 5:21
    2010年5月15日 12:28
    版主
  • 其实问题本身是比较复杂的。只是我把它简单化了提出来,需要怎么一个方法

    。。不然要写很长。。

    Form1.cs:

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                 //DataTable ds = SetParamClass.XmlFileToDataTable();
                //for (int i = 0; i < ds.Rows.Count; i++)           
                for (int i = 0; i < 3; i++)
                {
                    this.tabMain.TabPages.Add(i.ToString(),"tabPage"+i.ToString());
                   
                    this.tabMain.TabPages[i].Controls.Add(new UserControl1());

                }
            }

            private void btSave_Click(object sender, EventArgs e)
            {
                UserControl1 us=new UserControl1(); 

                us.WriteToXml();
            }

        }

    UserControl1.cs:

    public partial class UserControl1 : UserControl
        {
            public UserControl1()
            {
                InitializeComponent();
               
            }
            public string WriteToXml()

            {
                string name = this.txtName.Text;

               string leng= this.txtLeng.Text;

               string width=this.txtWidth.Text;

                ......等等
                SetParamClass.SaveToXml(name,leng,width );

            }
        }

      其它就是想在Form1中点击btSave按钮,一次性保存Form1中各个tabPage加载的UserControl1中的多个TextBox的值到Xml文件。      

    就是TexBox的值得不到。。

     

    2010年5月15日 14:12
  • 你好 !

         原理是一样的,你参考我上面的一些建议来做!

         你可以通过((UserControl1)this.TabControl1.TabPages[0].Controls[0]).Text来获取,这里你要给UserControl1定义Text属性!


    周雪峰
    2010年5月15日 14:22
    版主
  • 先谢谢你了。我只能明天再试试。

    2010年5月15日 14:47