none
請教一個有關 DataGridView 的 DataTable 資料繫結問題 RRS feed

  • 問題

  • 各位大大們午安,

    最近在寫一個有關資料庫操作的AP , 但是在DataGridView的操作上遇到了瓶頸...
    問題如下~

    有一個DataGridView, 其三個Column分別為

    [Column Name](String型態), [Data Type](SqlDbType列舉), [Description](String型態),

    其中 [Data Type] 欄位是一個DataGridViewComboBoxColumn, 其所對應的型態是SqlDbType列舉 ,
    我用SQL 語法去資料庫裡面撈到相對應的 DataTable 並將其 Bind 到 DataGridView 上面 ,
    但是會在 [Data Type] 的 SqlDbType 列舉部分產生錯誤, 因為 DataTable 上的三個 Column 皆為 String 型態造成型態不符,
    曾經用過 
    DataTable.Columns[1].DataType=typeof(SqlDbType);
    但是會出現例外-->當資料行擁有資料後就無法變更 DataType。

    請問有沒有方法可以將 DataTable 的欄位轉型並正確地 Binding 到 DataGridView上面呢?
    還是可以透過哪個DataTable 的 Event來進行手動型態改變?

    感謝各位大大相助
    2009年11月23日 上午 08:55

解答

所有回覆

  • 如果, 反過來想, 把DataGridView的那個欄位改成String型態呢 ?

    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    如果你自私地不肯回饋與分享,那別人為何要花時間回答你的問題?
    2009年11月23日 上午 10:27
    版主
  • 如果, 反過來想, 把DataGridView的那個欄位改成String型態呢 ?

    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    如果你自私地不肯回饋與分享,那別人為何要花時間回答你的問題?

    Bill 大大,

     [Data Type]欄位使用 SqlDbType列舉是要避免使用者輸入錯誤, 如果要改成使用String型態的DataGridViewTextBoxColumn 實在是有點困難耶...

    這幾天我一直在試那個DataGridViewComboBoxColumn的Binding
    發現就算是資料型態為正確的SqlDbType, 還是會有DataError事件發生
    以下提供我的程式碼...

            private void InitialDataGridView()
            {
                DataGridViewTextBoxColumn textBox;
                DataGridViewComboBoxColumn comboBox;
    
                dgvColumn.AutoGenerateColumns = false;//所有欄位都要手動 ADD & Binding DataSource
                dgvColumn.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;//欄位size
    
                textBox = new DataGridViewTextBoxColumn();
                textBox.Name = "Column Name";
                textBox.DataPropertyName = "Column Name";//Mapping Data Table Schema
                dgvColumn.Columns.Add(textBox);   
    
                comboBox = new DataGridViewComboBoxColumn();
                comboBox.Name = "Data Type";
                comboBox.DataPropertyName = "Data Type";//Mapping Data Table Schema
                comboBox.DataSource = Enum.GetValues(typeof(SqlDbType));
                comboBox.ValueType = typeof(SqlDbType);//Key Point
                dgvColumn.Columns.Add(comboBox);
    
                textBox = new DataGridViewTextBoxColumn();
                textBox.Name = "Description";
                textBox.DataPropertyName = "Description";//Mapping Data Table Schema
                dgvColumn.Columns.Add(textBox);
            }
    
            void test()
            {
                BindingSource bs = new BindingSource();
    
                DataTable dttest = new DataTable();
                dttest.Columns.AddRange(new DataColumn[]{new DataColumn("Column Name",typeof(String)),
                                                         new DataColumn("Data Type",typeof(SqlDbType)),
                                                         new DataColumn("Description",typeof(String))});
    
                //dttest.Rows.Add(new Object[] { "aa", 1, "bb" });
                dttest.Rows.Add();
                dttest.Rows[0][0] = "test100";
                dttest.Rows[0][1] = SqlDbType.Char;
                dttest.Rows[0][2] = "test101";
    
                bs.DataSource = dttest;
                dgvColumn.DataSource = bs;
    
            }
    請各位大大相救
    感謝~~
    2009年11月25日 上午 09:03
  • Hi,

    您可以參考下列作法, 透過程式去加item的作法 :
    http://msdn.microsoft.com/zh-tw/library/system.windows.forms.datagridviewcomboboxcolumn.aspx


    private static void SetAlternateChoicesUsingItems(
            DataGridViewComboBoxColumn comboboxColumn)
    {
            comboboxColumn.Items.AddRange("Mr.", "Ms.", "Mrs.", "Dr.");
    }
    

    微軟技術支援中心 (CSS)
    • 已提議為解答 Lolota Lee 2009年11月30日 上午 05:55
    • 已標示為解答 Lolota Lee 2009年12月3日 上午 05:12
    2009年11月30日 上午 05:54

  • 我用SQL 語法去資料庫裡面撈到相對應的 DataTable 並將其 Bind 到 DataGridView 上面 ,
    但是會在 [Data Type] 的 SqlDbType 列舉部分產生錯誤, 因為 DataTable 上的三個 Column 皆為 String 型態造成型態不符,
    曾經用過 
    DataTable.Columns[1].DataType=typeof(SqlDbType);
    
    
    但是會出現例外-->當資料行擁有資料後就無法變更 DataType。

    請問有沒有方法可以將 DataTable 的欄位轉型並正確地 Binding 到 DataGridView上面呢?
    還是可以透過哪個DataTable 的 Event來進行手動型態改變?

    感謝各位大大相助

     

    你可以再增加一個DataColumn來轉換DataTable的datatype

    例如

    你的DataTable.Columns["str"]是string 想轉換成double,然後將DataGridView去對應此欄位

    你可以如此作

       DataTable.Columns.Add(new DataColumn("dou",typeof(double),"str"));
       

    2010年5月21日 上午 01:34