none
動態 產生checkbox 相關問題 RRS feed

  • 問題

  • 小弟是C#初學者

    目前可以動態產生Checkbox 只要在Textbox 裡輸入行數 一排產生數個checkbox

    目前遇到兩個問題 不知該如何處裡 請各位大大給點方向

    雙迴圈 與陣列 觀念比較差 希望可以稍微說明一點


     
    1.目前在TEXTBOX 輸入 行數  動態產生出來的名稱  每行都是123456 
     

    想輸入3行 名稱變成123456
                               789101112
                               13~18
    順序下去到30以上

    2.勾選的Checkbox 可以記憶勾選過的 下次開啟畫面會紀錄上次勾選的選項?
    不知道 要怎樣存檔 可以將目前勾選過的 存成TXT 或是其他  下次開啟 自動開啟最後存檔的TXT

    以下是可以直接執行的程式碼 需要一個TextBox與Button 就可以 產生一個 一維陣列的CheckBox

    private void button1_Click(object sender, EventArgs e) 
    	       { 
    	               int ComIDCount = Convert.ToInt32(textBox1.Text);                     
    	               string[] ComID = new string[ComIDCount]; 
    	               panOnOff[] gbpanOnOff = new panOnOff[ComIDCount]; 
    	               for (int i = 0; i < ComIDCount; i++)               
    	               {                                       
    	                   gbpanOnOff[i] = new panOnOff(i, ComID[i]); 
    	                   this.Controls.Add(gbpanOnOff[i]);                   
    	               }     
    	       }   
    	 
    	 
    	 
    	     public class panOnOff : Panel 
    	       { 
    	           public int frmIndex;                              // 計錄陣列的指標 
    	           public string OComId;                             // 名稱 
    	           public CheckBox[] ckbCs = new CheckBox[6];        //  名稱, 以及1~5等共六個 
    	           public panOnOff(int tmpfrmIndex, string tmpOComId) 
    	           { 
    	               OComId = tmpOComId; 
    	               this.Width = 420; 
    	               this.Height = 30; 
    	               this.Left = 8; 
    	               this.Visible = true; 
    	               this.Top = 47 + this.Height * frmIndex;      // 利用指標來設定物件的 Top 
    	               this.BorderStyle = BorderStyle.FixedSingle; 
    	               for (int i = 0; i < ckbCs.Length; i++) 
    	               { 
    	                   ckbCs[i] = new CheckBox(); 
    	                   ckbCs[i].Top = 3; 
    	                   ckbCs[i].Left  = 68 * (i - 1) +68;       // 橫向排列六個 checkbox 
    	                   this.Controls.Add(ckbCs[i]); 
    	                   ckbCs[i].Visible = true; 
    	                   ckbCs[i].BringToFront();                 // 將checkbox擺放到panel之上 
    	                   ckbCs[i].Text = ("名稱" + (i + 1));      //  指定名稱   
    	                  
    	               } 
    	                   ckbCs[0].Left = 5;                       // 第一個 checkbox位置微調 
    	           }         
    	       }      






    • 已編輯 z4503 2014年7月25日 上午 01:53 修改
    2014年7月24日 下午 12:12

解答

  • 存取檔案可以考慮用 StreamReader StreamWriter
    類似以下的方法

            private void Form1_Load(object sender, EventArgs e)
            {
                fileName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\setting.dat";
                if (File.Exists(fileName))
                {
                    //若存在 讀取 文字檔內容
                    using (var reader = new StreamReader(fileName, Encoding.ASCII))
                    {
    // 取得 panel 個數 textBox1.Text = reader.ReadLine(); var panelCount = Convert.ToInt32(textBox1.Text); // 產生 CheckBox GenerateCheckBox(panelCount); for (int i = 0; i < panelCount; i++) { //設定 CheckBox 狀態 } } } }


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度

    • 已標示為解答 z4503 2014年7月28日 上午 06:55
    2014年7月25日 上午 10:25

所有回覆

  • 1. 名稱的部分

         修改以下這行..... 提示: 跟 tmpfrmIndex 有關

    ckbCs[i].Text = ("名稱" + (i + 1));

    2. 紀錄的部分
        把panOnOff 陣列 的宣告 放到 button1_Click 的外面
        可以利用 兩個迴圈 紀錄 是否有勾選
        PanOnOff 多一個函數 傳入 boolean 陣列 代表對應的checkbox 是否有勾選


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度


    • 已編輯 Alex_Lee 2014年7月25日 上午 05:11
    2014年7月25日 上午 01:06
  • 謝謝 大大給的方向 我再試試看   
    2014年7月25日 上午 02:14
  • 您好,
    Panel的位置似乎由建立者來設定會比較OK吧!
    Panel的ID也要給設定好再傳入哦!
    for (int i = 0; i < ComIDCount; i++)
    {
        //先給Panel的Name
        ComID[i] = string.Format("panOnOff_{0}", i);
        gbpanOnOff[i] = new panOnOff(i, ComID[i]);
        //位罝由外面來控制似乎比較OK!
        gbpanOnOff[i].Top = 47 +  gbpanOnOff[i].Height * i;
        this.Controls.Add(gbpanOnOff[i]);
    }     
    CheckBox的ID,像Alex大仔說的
    可加入 tmpfrmIndex 讓它從 ckbCs.Length 倍數,再去加原本迴圈的值 !

    或者是加上Container的Name去區分,這樣之後在記錄或是取值時,會比較方便哦!
    ckbCs[i].Name = string.Format("{0}_{1}", OComId, i);


    記錄CheckBox的話,不知您記錄TextBox是記在那裡呢?
    您可以在 panOnOff 類別中增加一個 記錄 CheckBox 勾選值的 Method 及 讀取值的 Method!
    然後在存TextBox後,同時呼叫每個panOnOff物件去儲存,
    如果要取出值的話,就一樣先依TextBox中的值建立好 panOnOff ,然後再呼叫每個 panOnOff物件去取出CheckBox的勾選值。

    有問題再提出來討論哦!


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2014年7月25日 上午 02:15

  • 名稱部分 兩位大大提醒之後 才想通  已改成 ckbCs[i].Text = ("名稱" + (i + 1 + (tmpfrmIndex * 10)));

    亂馬客大大 不知道您方不方便  提供 panOnOff 類別中增加一個 記錄 CheckBox 勾選值的 Method 及 讀取值的 Method 的 類似程式碼或是簡單範例?? 或是google 要搜尋那些 關鍵字    實在蠻抽象如何使用您和Alex大大說的 方法

    存檔部分目前想以存TXT 檔  或是 其他較方便的方法 都可以   沒有寫過這類動態產生物件的功能 很陌生.....@@




    2014年7月25日 上午 02:51
  • 您好,

    其實儲存的方式蠻多,就像您會存在txt file之中,ini也可以!

    也可放在app.config之中,

    可參考: Read/Write App.config with .NET 2.0/Enterprise Library

    Ohter info:

    https://www.google.com.tw/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#ie=UTF-8&q=.net%20winform%20save%20settings&sourceid=chrome-psyapi2


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2014年7月25日 上午 05:14
  • 存取檔案可以考慮用 StreamReader StreamWriter
    類似以下的方法

            private void Form1_Load(object sender, EventArgs e)
            {
                fileName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\setting.dat";
                if (File.Exists(fileName))
                {
                    //若存在 讀取 文字檔內容
                    using (var reader = new StreamReader(fileName, Encoding.ASCII))
                    {
    // 取得 panel 個數 textBox1.Text = reader.ReadLine(); var panelCount = Convert.ToInt32(textBox1.Text); // 產生 CheckBox GenerateCheckBox(panelCount); for (int i = 0; i < panelCount; i++) { //設定 CheckBox 狀態 } } } }


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度

    • 已標示為解答 z4503 2014年7月28日 上午 06:55
    2014年7月25日 上午 10:25
  • 謝謝兩位 大大給的 參考

    本來沒有方向 目前有參考的方向 比較知道 要找什麼來實現此功能 非常感謝

    2014年7月28日 上午 06:56