none
Visual Studio 2010 可以用迴圈取得window form上textbox的值嗎? RRS feed

  • 問題

  • 目前使用VS 2010幫公司開發Window form,

    form上有些textbox的name是A1、A2、A3.......A50;B1、B2......B50(以下類推)。

    如果用A1.text的方式取得欄位中的值要花太多工了,

    請問是否能用迴圈取得textbox值呢?

    感謝~

    2014年2月27日 上午 05:33

解答

  • 我跑起來沒問題呀?

    另一個可能是你的控制項用別的容器裝起來(Panel、GroupBox)

    把Me.Controls改成   你的容器.Controls就可以了

    • 已編輯 GISK 2014年2月27日 上午 06:59
    • 已標示為解答 Seabok Hsieh 2014年3月1日 上午 02:06
    2014年2月27日 上午 06:57
  • David Kuo先進的連結是一個方法

    另一個簡便型的

    for i=0 to 5
        你的變數 = me.Controls("文字盒名稱" & i).Text
    next

    有問題再用Ctype轉

    • 已編輯 GISK 2014年2月27日 上午 06:13
    • 已標示為解答 Seabok Hsieh 2014年3月1日 上午 02:06
    2014年2月27日 上午 06:07
  • 直接用 Databindings 比較乾脆 . 就不用從甚麼 TextBox.Text 取值了, 直接從資料內取值. (以下程式碼執行後, 在畫面上的 textbox2 輸入值, 再按 button1,  就會看到你在畫面中輸入值後, 連帶 data 內相對應的值也會改變.

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            List<MyData> data = new List<MyData>();
    
            private void Form1_Load(object sender, EventArgs e)
            {
                data.Add(new MyData { Str = "1" });
                data.Add(new MyData { Str = "2" });
                textBox1.DataBindings.Add("Text", data[0], "str");
                textBox2.DataBindings.Add("Text", data[1], "str");
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
    
                MessageBox.Show(data[1].Str.ToString());
            }
        }
    
        public class MyData
        {
            public string Str
            { get; set; }
        }


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 Seabok Hsieh 2014年3月1日 上午 02:07
    2014年2月27日 上午 08:38
    版主

所有回覆

  • http://msdn.microsoft.com/zh-tw/library/system.windows.forms.control.controlcollection.find(v=vs.110).aspx
    • 已提議為解答 GISK 2014年2月27日 上午 06:11
    2014年2月27日 上午 06:03
  • David Kuo先進的連結是一個方法

    另一個簡便型的

    for i=0 to 5
        你的變數 = me.Controls("文字盒名稱" & i).Text
    next

    有問題再用Ctype轉

    • 已編輯 GISK 2014年2月27日 上午 06:13
    • 已標示為解答 Seabok Hsieh 2014年3月1日 上午 02:06
    2014年2月27日 上午 06:07
  • 感謝GISK提供的方法,但我試著處理時會Error(如下圖)

    David Kuo的連結小弟看不大懂,能否再給個範例呢?

    感激不盡~


    2014年2月27日 上午 06:45
  • 我跑起來沒問題呀?

    另一個可能是你的控制項用別的容器裝起來(Panel、GroupBox)

    把Me.Controls改成   你的容器.Controls就可以了

    • 已編輯 GISK 2014年2月27日 上午 06:59
    • 已標示為解答 Seabok Hsieh 2014年3月1日 上午 02:06
    2014年2月27日 上午 06:57
  • 我是寫在一個按鈕中,想以按下按鈕引發取得Textbox值的動作。不知是否因為這樣才作不出來?
    2014年2月27日 上午 07:03
  • 同樣做法,沒有不同,用偵錯模式看看你的錯誤訊息停在哪一行


    2014年2月27日 上午 07:08
  • 感謝GISK前輩,剛又試了一下發現問題點原來是我的控制項被別的容器裝起來了(Panel & GroupBox)。再請問容器是否也能用controls處理呢? 因為仍有其他textbox放在其他panel上。感謝您的回答。

    2014年2月27日 上午 07:36
  • Me.Controls.Find("A" & index, True)

    利用 Controls.Find 去搜尋,這樣就不會有容器的問題,第二個參數是否搜尋所有的子控制項
    2014年2月27日 上午 07:53
  • David Kuo先進您好

    MSDN上的說明,搜尋子控制項這部分我不是很懂

    是找出繼承此控制項的所有子控制項,並回傳含有這些子控制項的Control陣列嗎?

    2014年2月27日 上午 08:03
  • GISK 您好:

    如果有繼承,也會找出父代視窗的控制項,但是如果子視窗的 Name 與父視窗的 Name 相同的話,就會取父視窗的控制項。

    回到此問題,就視 Seabok Hsieh 是否有視窗繼承且名稱相衝突的問題。再取決於是否要用此方法。

    • 已編輯 David Kuo 2014年2月27日 上午 08:36
    2014年2月27日 上午 08:34
  • 直接用 Databindings 比較乾脆 . 就不用從甚麼 TextBox.Text 取值了, 直接從資料內取值. (以下程式碼執行後, 在畫面上的 textbox2 輸入值, 再按 button1,  就會看到你在畫面中輸入值後, 連帶 data 內相對應的值也會改變.

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            List<MyData> data = new List<MyData>();
    
            private void Form1_Load(object sender, EventArgs e)
            {
                data.Add(new MyData { Str = "1" });
                data.Add(new MyData { Str = "2" });
                textBox1.DataBindings.Add("Text", data[0], "str");
                textBox2.DataBindings.Add("Text", data[1], "str");
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
    
                MessageBox.Show(data[1].Str.ToString());
            }
        }
    
        public class MyData
        {
            public string Str
            { get; set; }
        }


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 Seabok Hsieh 2014年3月1日 上午 02:07
    2014年2月27日 上午 08:38
    版主
  • 原來如此,感謝David Kuo先進指點

    如果容器多且沒有名稱衝突,用Controls.Find應該是比較方便的做法

    如果都裝在同容器中,用Container.Controls("ControlName")比較直覺

    但執行耗費時間我就不清楚了,對於重視執行時間的專案就要好好考慮一番

    ==========================================

    Bill叔的方法就沒有尋找控制項的問題了

    我的思考面還不夠廣,完全沒想到用List和DataBinding來做

    上了一課

    • 已編輯 GISK 2014年2月27日 上午 08:50 增加===以下內容
    2014年2月27日 上午 08:43
  • 感謝各位前輩大力協助,真的讓小弟上了很棒的課~
    2014年3月1日 上午 02:08
  • 相關討論可以搜尋 控制項陣列

    http://social.msdn.microsoft.com/Forums/zh-TW/home?searchTerm=%E6%8E%A7%E5%88%B6%E9%A0%85%E9%99%A3%E5%88%97


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2014年3月1日 上午 06:10