程式碼如下: public partial class DataGridViewEx:System.Windows.Forms.DataGridView { private Point MyPoint; private Control parentCTL; private ComboBox dtCombo; private DateTimePicker dtPicker; /// 紀錄可編輯的欄位名稱 private StringDictionary ColmmEdit; /// 紀錄要使用日期資料的欄位名稱 private StringDictionary ColmmDate; /// 紀錄要使用的下拉欄位名稱 private StringDictionary ColmmCombo; public DataGridViewEx() : base() { this.EditMode = DataGridViewEditMode.EditProgrammatically; if (!DesignMode) { MyPoint = new Point(); ColmmEdit = new StringDictionary(); ColmmDate = new StringDictionary(); ColmmCombo = new StringDictionary(); this.Disposed += DataGridViewEx_Disposed; this.CellClick += DataGridViewEx_CellClick; this.CellEnter += DataGridViewEx_CellClick; this.EditingControlShowing += DataGridViewEx_EditingControlShowing; FirstSetDataTimePicker(); FirstSetComboBox(); this.AllowUserToAddRows = true; this.AllowUserToDeleteRows = true; this.AllowUserToOrderColumns = false; this.AllowUserToResizeColumns = false; this.AllowUserToResizeRows = false; } } private void DataGridViewEx_Disposed(object sender, EventArgs e) { if (!DesignMode) { dtPicker.Dispose(); dtCombo.Dispose(); } } /// 設定可編輯的欄位 public void SetColmmEditName(string NameValue) { if(!ColmmEdit.ContainsKey(NameValue)) { ColmmEdit.Add(NameValue, NameValue); } } /// 設定要使用DateTimePicker的欄位 public void SetColmmDateName(string NameValue) { if (!ColmmDate.ContainsKey(NameValue)) { ColmmDate.Add(NameValue, NameValue); } } /// 設定要使用ComboBox的欄位 public void SetColmmComboName(string NameValue) { if (!ColmmCombo. ContainsKey(NameValue)) { ColmmCombo.Add(NameValue, NameValue); } } /// 檢查欄位是否可以編輯 private void DataGridViewEx_CellClick(object sender, DataGridViewCellEventArgs e) { if(this.Rows.Count>0) { if ((e.RowIndex> -1) && (e.ColumnIndex > -1)) { if (ColmmEdit.ContainsKey(this.Columns[e.ColumnIndex].Name)) { this.BeginEdit(true); } else { this.EndEdit(); } } else { this.EndEdit(); } } } /// 判斷是否使用DateTimePicker、ComboBox private void DataGridViewEx_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { if (this.Rows.Count > 0) { if (this.CurrentCell.RowIndex > -1 && this.CurrentCell.ColumnIndex > -1) { if (parentCTL == null) { parentCTL = e.Control.Parent; parentCTL.Controls.Add(dtPicker); parentCTL.Controls.Add(dtCombo); } MyPoint.X = e.Control.Location.X - e.Control.Margin.Left < 0 ? 0 : e.Control.Location.X - e.Control.Margin.Left; MyPoint.Y = e.Control.Location.Y - e.Control.Margin.Top < 0 ? 0 : e.Control.Location.Y - e.Control.Margin.Top; if (ColmmDate.ContainsKey(this.Columns[this.CurrentCell.ColumnIndex].Name)) { SetDataTimePickerView(ref e); } else { MyPoint.X = 0; MyPoint.Y = 0; dtPicker.Location = MyPoint; dtPicker.Visible = false; } if (ColmmCombo.ContainsKey(this.Columns[this.CurrentCell.ColumnIndex].Name)) { SetComboBoxView(ref e); } else { MyPoint.X = 0; MyPoint.Y = 0; dtCombo.Location = MyPoint; dtCombo.Visible = false; } } } } private void FirstSetComboBox() { dtCombo = new ComboBox(); dtCombo.Name = "ComboBox1"; dtCombo.FlatStyle = FlatStyle.Flat; dtCombo.Font = this.AlternatingRowsDefaultCellStyle.Font; dtCombo.Visible = false; dtCombo.SelectedIndexChanged += new EventHandler(ComboBox1_SelectedIndexChanged); } private void ComboBox1_SelectedIndexChanged(object sender, EventArgs e) { this.CurrentCell.Value = ((ComboBox)sender).SelectedItem; } /// 設定下拉選單內容 public void SetComboData(string[] Value) { dtCombo.Items.Clear(); dtCombo.Items.AddRange(Value); } private void SetComboBoxView(ref DataGridViewEditingControlShowingEventArgs e) { dtCombo.Size = this.CurrentCell.Size; dtCombo.Location = MyPoint; if (e.Control.Text != "") { dtCombo.SelectedItem = e.Control.Text; } else { dtCombo.SelectedIndex = -1; } e.Control.Visible = false; dtCombo.Visible = true; } /// DateTimePicker的日期資料回寫欄位 private void dateTimePicker1_ValueChanged(object sender, EventArgs e) { this.CurrentCell.Value = ((DateTimePicker)sender).Value.ToString("yyyy/MM/dd"); } private void FirstSetDataTimePicker() { dtPicker = new DateTimePicker(); dtPicker.Name = "dateTimePicker1"; dtPicker.Format = DateTimePickerFormat.Custom; dtPicker.CustomFormat = "yyyy/MM/dd"; dtPicker.MinDate = DateTime.Parse("1920/01/01"); dtPicker.CalendarFont = this.AlternatingRowsDefaultCellStyle.Font; dtPicker.Visible = false; dtPicker.ValueChanged += new EventHandler(dateTimePicker1_ValueChanged); } private void SetDataTimePickerView(ref DataGridViewEditingControlShowingEventArgs e) { dtPicker.Size = this.CurrentCell.Size; dtPicker.Location = MyPoint; dtPicker.MaxDate = DateTime.Now; if (e.Control.Text != "") { dtPicker.Value = DateTime.ParseExact(e.Control.Text, dtPicker.CustomFormat, null); } else { dtPicker.Value = DateTime.Now; this.CurrentCell.Value = dtPicker.Value.ToString("yyyy/MM/dd"); } e.Control.Visible = false; dtPicker.Visible = true; } }