WPF DataGrid 以DataTable為數據源,自定義某列為ComboBox的方法


在項目中遇到的一個實際問題。現在有一個DataTable,希望能夠自動顯示在DataGrid中,但是因為有一個外鍵的關系,所以希望用ComboBox在定制某一列。xaml的方式比較死板,所以想用代碼進行解析。直接上代碼,稍后逐步解釋。

1. DataGrid 初始化時分配數據(相應Initialized事件)

            // 在這里第一次加載數據
            DataTable dt = new DataTable("test");

            // first of all, manually create a DataTable
            dt.Columns.Add(new DataColumn("id", typeof(int)));
            dt.Columns.Add(new DataColumn("name", typeof(string)));
            dt.Columns.Add(new DataColumn("測試", typeof(string)));

            // insert lines
            DataRow dr = dt.NewRow();
            dr["id"] = 1;
            dr["name"] = "BB1";
            dr["測試"] = "測試1";
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr["id"] = 2;
            dr["name"] = "BB2";
            dr["測試"] = "測試2";
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr["id"] = 3;
            dr["name"] = "BB3";
            dr["測試"] = "測試3";
            dt.Rows.Add(dr);

            dataGrid.DataContext = dt;

2. 在WPF框架自動生成某個列的時候,進行干涉(響應AutoGeneratingColumn事件)

private void OnDataGridAutoGeneratingColumn(
            object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            // 只想干涉“id”列
            if (e.PropertyName == "id")
            {
                // 模擬出外鍵所在的表
                DataTable dt = new DataTable("test");

                // first of all, manually create a DataTable
                dt.Columns.Add(new DataColumn("id", typeof(int)));
                dt.Columns.Add(new DataColumn("name", typeof(string)));

                // insert lines
                DataRow dr = dt.NewRow();
                dr["id"] = 5;
                dr["name"] = "CC1";
                
                dt.Rows.Add(dr);

                dr = dt.NewRow();
                dr["id"] = 6;
                dr["name"] = "CC2";
                dt.Rows.Add(dr);

                dr = dt.NewRow();
                dr["id"] = 7;
                dr["name"] = "CC3";
                dt.Rows.Add(dr);


                // 方法一:使用DataGridTemplateColumn定制ComboBox,有點是不編輯時,也是顯示為ConboBox的樣子  
                DataGridTemplateColumn column = new DataGridTemplateColumn();
                column.Header = "id";
                DataTemplate datatemplate = new DataTemplate();
                FrameworkElementFactory fef = new FrameworkElementFactory(typeof(ComboBox));
                Binding binding = new Binding();
                binding.Source = dt.DefaultView;
                fef.SetBinding(ComboBox.ItemsSourceProperty, binding);
                Binding selectVal = new Binding("id");
                selectVal.Mode = BindingMode.TwoWay;
                fef.SetBinding(ComboBox.SelectedValueProperty, selectVal);
                fef.SetValue(ComboBox.DisplayMemberPathProperty, "name");
                fef.SetValue(ComboBox.SelectedValuePathProperty, "id");
                datatemplate.VisualTree = fef;
                column.CellTemplate = datatemplate;
                e.Column = column;
                

                //方法二:使用DataGridConboBoxColumn,功能與上面的等價
                //DataGridComboBoxColumn comboBoxColumn = new DataGridComboBoxColumn();
                //comboBoxColumn.Header = "fuck";
                //// ComboBox 選擇后的值
                //comboBoxColumn.SelectedValuePath = "id";
                //// ComboBox 前台顯示的值
                //comboBoxColumn.DisplayMemberPath = "name";

                //Binding binding = new Binding();
                //// 需要綁定的列
                //binding.Path = new PropertyPath("id");
//指定立即更新
//binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
//comboBoxColumn.SelectedValueBinding = binding; //Binding itemsSourceBinding = new Binding(); //itemsSourceBinding.Source = dt.DefaultView; //BindingOperations.SetBinding(comboBoxColumn, DataGridComboBoxColumn.ItemsSourceProperty, itemsSourceBinding); //e.Column = comboBoxColumn; } }

關於ComboBox的各個Property的意思,請參看http://blogs.msdn.com/b/vinsibal/archive/2008/10/31/wpf-datagrid-datagridcomboboxcolumn-v1-intro.aspx  , 里面有一個關於外鍵的例子。

關於DataGridTemplateColumn 的使用,主要參考了http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/3ada4685-a032-4bf0-9514-f86c44967678?persist=True ,但是也有一點修改,主要是,一個Panel加進去之后就不工作了。。。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM