none
資料填入dataGridView問題 RRS feed

  • 問題

  • 小弟不才 剛學習C#不久

    功能是希望能把

    按下按鈕後

    dgvBook中的一些內容抓取出來然後填入dgvLend

    把經與資料庫綁定後的label資料抓取一樣填入dgvLend中

    其中我有成功做出來的只有將dgvBook中的BookID成功抓取並填入

    其他數值 我使用trycatch測試後 他出現以下訊息:

    索引超出範圍 必須為非負數且小於集合的大小 參數名稱 index

    經查詢後仍不清楚問題點在哪

    煩請各位大哥大姊指教

     private void btnLendOut_Click(object sender, EventArgs e)
            {
                if (string.IsNullOrEmpty(txtFindBook.Text)) //確認txtFindBook是否為0
                {
                    MessageBox.Show("請輸入書籍代碼,並查詢確認");
                    return;
                }
                else
                {
                    //Dbcon.ConnectionString = conStr;
                    //Dbcon.Open();
    
                    try { 
                        OleDbDataAdapter Dbadp = new OleDbDataAdapter("SELECT *FROM LendData", Dbcon);
                        Dbadp.Fill(ds, "Lend");
                        dgvLend.DataSource = ds.Tables["Lend"];
    
                        string empBookID, empBookName, empCategory, empPersonID, empPersonName, empFirstDay, empLastDay,empNickName;
    
                        empBookName = Convert.ToString(dgvBook.Rows[0].Cells[1].Value);
                        empBookID = Convert.ToString(dgvBook.CurrentRow.Cells[0].Value); //抓取現有資訊
    
                        empPersonID = lbID.Text;
                        empPersonName = lbName.Text;
                        empNickName = lbNickName.Text;
    
                        dgvLend[0, 0].Value = empBookID; //將值填入表單
    
                        dgvLend[0, 1].Value = empBookName; //此開始有問題
                        dgvLend[0, 2].Value = empPersonID; 
                        dgvLend[0, 3].Value = empPersonName;
                        dgvLend[0, 4].Value = empNickName;
    
                        
                                        
    
    
                        Dbcon.Close();
    
    
                    }
                    catch(Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }

    這是我做的介面



    2018年5月23日 上午 05:08

解答

  • 我剛剛複製貼上的你代碼

    發現...

    你是不是只有一筆資料,加上你應該是 col 跟 row 搞錯邊了。

    所以到第二筆的時候就掛掉了。

    2018年5月24日 下午 03:57

所有回覆

  • 用 Binding (繫結) 會比較快樂,程式也會比較好維護

    詳見

    (1) 如何:將資料繫結至 Windows Forms DataGridView 控制項 

    (2) DataGridView.DataSource 屬性

    (3) DataGridView 控制項 (Windows Form)


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


    2018年5月23日 上午 05:45
    版主
  • 索引超出範圍 必須為非負數且小於集合的大小 參數名稱 index

    舉個例子就是

    可能你要呼叫  dgvBook.Rows[0].Cells[1].Value

    但是實際上 dgvBook.Rows 根本就沒有 index 為 0 的資料

    或是 dgvBook.Rows[0].Cells 根本就沒有 index 為 1 的資料。

    假設  dgvBook.Rows 有 3 個 Rows 所以你的 index 就是 0,1,2 

    如果你 index 為 3 ,並且執行到 dgvBook.Rows[3]  就會爆出 "索引超出範圍 必須為非負數且小於集合的大小 參數名稱 index" 的錯誤

    下中斷點去追蹤 並把你的集合加入監看式 看有多少資料。


    2018年5月23日 上午 06:04
  • 您可以確定一下, 查詢敘述有查到記錄, 如果符合查詢條件的記錄數為0, 程式就會發生錯誤, 另外, 您的查詢敘述好像怪怪的, 好像少一個空格:

    "SELECT *FROM LendData",

    應該這樣才對:

    "SELECT * FROM LendData"

    2018年5月24日 上午 12:33
  • 用 Binding (繫結) 會比較快樂,程式也會比較好維護

    詳見

    (1) 如何:將資料繫結至 Windows Forms DataGridView 控制項 

    (2) DataGridView.DataSource 屬性

    (3) DataGridView 控制項 (Windows Form)


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


    不過我覺得使用綁定的方法 似乎有些綁手綁腳(? 
    使用上沒有直接呼叫的靈活

    我之前有用過一次 但時常會聯繫不上資料庫 而錯誤
    2018年5月24日 下午 02:24
  • @Coding Kid Peter Chang  @tihs

    我調查了之後 我從dgvBook、Lader那邊的資料都有成功的抓到

    但在填入到dgvLend的時候發生了上述的問題。

    想請問一下 會不會是填入一行新資料的時候 不能像我目前的程式一個一個的輸入 ?

    必須要全部一起同時填入?


    2018年5月24日 下午 02:48
  • 我剛剛複製貼上的你代碼

    發現...

    你是不是只有一筆資料,加上你應該是 col 跟 row 搞錯邊了。

    所以到第二筆的時候就掛掉了。

    2018年5月24日 下午 03:57
  • 用 Binding (繫結) 會比較快樂,程式也會比較好維護

    詳見

    (1) 如何:將資料繫結至 Windows Forms DataGridView 控制項 

    (2) DataGridView.DataSource 屬性

    (3) DataGridView 控制項 (Windows Form)


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


    不過我覺得使用綁定的方法 似乎有些綁手綁腳(? 
    使用上沒有直接呼叫的靈活

    我之前有用過一次 但時常會聯繫不上資料庫 而錯誤

    我覺得是你可能不會用!!

    加上你目前的代碼是很奇怪的。

    因為你有先 dgvLend.DataSource = ds.Tables["Lend"]; 其實你已經有資料細節了

    但是我不知道為什麼你要從另外的 dgvBook 跟 其他的控制項取得資訊。

    因為你這樣的行為是 Update 來自 Lend 的第一筆資料,而不是新增一筆資料。

    --------------------

    我覺得如果你沒有像是購物車那樣需要暫存的話,我是建議可以直接 insert 一筆借閱資料,

    然後在取得最新的 借閱資料並且更新 DataGridView 這是我的想法拉!

    2018年5月24日 下午 04:03
  • 我在 Windows Forms 的 DataGridView 用 Binding 用了十幾年,也從沒見過甚麼真的源自於 .Net Framework 的 bug。

    當一個程式設計師能夠善用資料/畫面分離的設計,才能有效降低問題的發生。


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

    2018年5月24日 下午 04:16
    版主
  • 用 Binding (繫結) 會比較快樂,程式也會比較好維護

    詳見

    (1) 如何:將資料繫結至 Windows Forms DataGridView 控制項 

    (2) DataGridView.DataSource 屬性

    (3) DataGridView 控制項 (Windows Form)


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


    不過我覺得使用綁定的方法 似乎有些綁手綁腳(? 
    使用上沒有直接呼叫的靈活

    我之前有用過一次 但時常會聯繫不上資料庫 而錯誤

    我覺得是你可能不會用!!

    加上你目前的代碼是很奇怪的。

    因為你有先 dgvLend.DataSource = ds.Tables["Lend"]; 其實你已經有資料細節了

    但是我不知道為什麼你要從另外的 dgvBook 跟 其他的控制項取得資訊。

    因為你這樣的行為是 Update 來自 Lend 的第一筆資料,而不是新增一筆資料。

    --------------------

    我覺得如果你沒有像是購物車那樣需要暫存的話,我是建議可以直接 insert 一筆借閱資料,

    然後在取得最新的 借閱資料並且更新 DataGridView 這是我的想法拉!

    好...我在想想看要怎麼改....

    我的確真的不算很熟

    我本身非資管系 也只因為單純因唸理工 然後想幫社團寫一個系統 而開發XD
    目前從接觸到C#到現在也只不過4個月

    還需要學很多東西呢@@ 

    2018年5月27日 下午 03:11
  • 目前接觸過的實例還太少
    我會努力看看的

    2018年5月27日 下午 03:12
  • 我剛剛複製貼上的你代碼

    發現...

    你是不是只有一筆資料,加上你應該是 col 跟 row 搞錯邊了。

    所以到第二筆的時候就掛掉了。

    感謝三位 @Coding Kid Peter Chang @tihs @Bill Chung

    大大 幫我解答 最後發現原來只是顛倒 而導致無法填入的問題@@

    抱歉浪費了你們這麼多的時間XD

    2018年5月27日 下午 04:27