none
請教有關在DataGridView內加入DataGridViewComboBoxColumn的問題 RRS feed

  • 問題

  • 我想在DataGridView1中加入ComboBox的控制項,但卻怎麼試都不行。
    不曉得在哪裡出了問題,煩請高手協助,謝謝。 >"<

     

    Dim dt As New DataTable

    Dim dv As DataView

    dt = ds.Tables("Product")

    dv = New DataView(dt)

    ...

     

    Private Sub DataGridView1_CellFormatting(ByVal sender As ObjectByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting

    Select Case DataGridView1.Columns(e.ColumnIndex).Name

    Case "產品名稱"

    Dim cbColumn As New DataGridViewComboBoxColumn

    cbColumn.Items.Add("產品一")

    cbColumn.Items.Add("產品二")

    End Select

    End Sub

     

    我將新增ComboBox控制項的動作透過CellFormatting的Event來產生,不知道這樣子的概念對不對?
    煩請指教...

    2007年11月24日 下午 01:11

解答

  • HI,

     

    您可以在Form的Load事件執行以下的程式:

     

    Dim col As New DataGridViewComboBoxColumn()

    col.DataSource=DataTable物件
    col.DisplayMember = "欲顯示的欄位名稱"

    col.ValueMember = "欲執行關聯查詢欄位名稱"
    col.HeaderText = "欄位標題文字"

    DataGridView物件.Columns.Add(col)

     

    tihs

    2007年11月24日 下午 02:03
  • 寫一個範例你試試看....

     

    程式碼區塊

    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Data;
    using System.Data.SqlClient;
    using System.Windows.Forms;

     

    namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();

     

                // 新增一個 combobox column

                DataGridViewComboBoxColumn customerIDColumn = new DataGridViewComboBoxColumn();
                customerIDColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader;

     

                // 連結 CustomerID 欄位
                customerIDColumn.DataPropertyName = "CustomerID";

     

                // 將資料庫中所有相異的 CustomerID 抓出來當作下拉選單值
                string strConn = ConfigurationManager.ConnectionStrings["NORTHWND"].ConnectionString;
                SqlConnection conn = new SqlConnection(strConn);

                conn.Open();

                DataSet ds = new DataSet();
                string sql = "SELECT DISTINCT CustomerID FROM Orders";
                SqlDataAdapter da = new SqlDataAdapter(sql, conn);
                da.Fill(ds);

                conn.Close();

                List<string> strList = new List<string>();

                foreach (DataRow dr in ds.Tables[0].Rows)
                {
                    strList.Add(dr[0].ToString());
                }

                customerIDColumn.Items.AddRange(strList.ToArray());

     


                customerIDColumn.Sorted = true;
                customerIDColumn.SortMode = DataGridViewColumnSortMode.Automatic;
                customerIDColumn.HeaderText = "CustomerID";
                customerIDColumn.Name = "CustomerID";
                customerIDColumn.ReadOnly = false;

     

                // 當焦點進入 cell 立刻可編輯

                dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter;

                // 加入 column
                dataGridView1.Columns.Add(customerIDColumn);
            }

     

            private BindingSource bs = new BindingSource();

            private void Form1_Load(object sender, EventArgs e)
            {
                string strConn = ConfigurationManager.ConnectionStrings["NORTHWND"].ConnectionString;
                SqlConnection conn = new SqlConnection(strConn);

     

                conn.Open();

                DataSet ds = new DataSet();
                string sql = "SELECT * FROM Orders";
                SqlDataAdapter da = new SqlDataAdapter(sql, conn);
                da.Fill(ds);

                conn.Close();

     

                bs.DataSource = ds.Tables[0];
                bindingNavigator1.BindingSource = bs;
                dataGridView1.DataSource = bs;
            }
        }
    }

     

     

    2007年11月24日 下午 02:20

所有回覆

  • 經剛再度測試後,若需外加控制項必須透過UI介面進行新增的動作。
    即可以達到上述需求。(自問自答 囧rz)

    不曉得有哪位高手可以提供透過程式碼就可以進行新增動作的相關資訊...

     

    2007年11月24日 下午 01:50
  • HI,

     

    您可以在Form的Load事件執行以下的程式:

     

    Dim col As New DataGridViewComboBoxColumn()

    col.DataSource=DataTable物件
    col.DisplayMember = "欲顯示的欄位名稱"

    col.ValueMember = "欲執行關聯查詢欄位名稱"
    col.HeaderText = "欄位標題文字"

    DataGridView物件.Columns.Add(col)

     

    tihs

    2007年11月24日 下午 02:03
  • 寫一個範例你試試看....

     

    程式碼區塊

    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Data;
    using System.Data.SqlClient;
    using System.Windows.Forms;

     

    namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();

     

                // 新增一個 combobox column

                DataGridViewComboBoxColumn customerIDColumn = new DataGridViewComboBoxColumn();
                customerIDColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader;

     

                // 連結 CustomerID 欄位
                customerIDColumn.DataPropertyName = "CustomerID";

     

                // 將資料庫中所有相異的 CustomerID 抓出來當作下拉選單值
                string strConn = ConfigurationManager.ConnectionStrings["NORTHWND"].ConnectionString;
                SqlConnection conn = new SqlConnection(strConn);

                conn.Open();

                DataSet ds = new DataSet();
                string sql = "SELECT DISTINCT CustomerID FROM Orders";
                SqlDataAdapter da = new SqlDataAdapter(sql, conn);
                da.Fill(ds);

                conn.Close();

                List<string> strList = new List<string>();

                foreach (DataRow dr in ds.Tables[0].Rows)
                {
                    strList.Add(dr[0].ToString());
                }

                customerIDColumn.Items.AddRange(strList.ToArray());

     


                customerIDColumn.Sorted = true;
                customerIDColumn.SortMode = DataGridViewColumnSortMode.Automatic;
                customerIDColumn.HeaderText = "CustomerID";
                customerIDColumn.Name = "CustomerID";
                customerIDColumn.ReadOnly = false;

     

                // 當焦點進入 cell 立刻可編輯

                dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter;

                // 加入 column
                dataGridView1.Columns.Add(customerIDColumn);
            }

     

            private BindingSource bs = new BindingSource();

            private void Form1_Load(object sender, EventArgs e)
            {
                string strConn = ConfigurationManager.ConnectionStrings["NORTHWND"].ConnectionString;
                SqlConnection conn = new SqlConnection(strConn);

     

                conn.Open();

                DataSet ds = new DataSet();
                string sql = "SELECT * FROM Orders";
                SqlDataAdapter da = new SqlDataAdapter(sql, conn);
                da.Fill(ds);

                conn.Close();

     

                bs.DataSource = ds.Tables[0];
                bindingNavigator1.BindingSource = bs;
                dataGridView1.DataSource = bs;
            }
        }
    }

     

     

    2007年11月24日 下午 02:20
  • 但若是加在Form_Load下,

    因為我會將DataGridView設定DataSource,

    在DataBinding後,DataGridView整個資料內容都將完全Reflash…

    剛新增的DataGridViewComboBoxColumn也就會消失…

    有什麼方法可以補救的嗎?

    2007年12月7日 下午 12:15
  • 把程式碼丟上來看看吧...

     

    2007年12月7日 下午 02:53