我知道這個問題很老了,但是我想分享一些演示代碼這個問題幫助了我。
- 創建一個具有
Button
和DataGridView
- 表格註冊一個
Click
事件爲Button1
- 爲DataGridView1
- 集DataGridView1的財產
EditMode
註冊一個CellClick
事件EditProgrammatically
- 下面的代碼粘貼到Form1:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
DataTable m_dataTable;
DataTable table { get { return m_dataTable; } set { m_dataTable = value; } }
private const string m_nameCol = "Name";
private const string m_choiceCol = "Choice";
public Form1()
{
InitializeComponent();
}
class Options
{
public int m_Index { get; set; }
public string m_Text { get; set; }
}
private void button1_Click(object sender, EventArgs e)
{
table = new DataTable();
table.Columns.Add(m_nameCol);
table.Rows.Add(new object[] { "Foo" });
table.Rows.Add(new object[] { "Bob" });
table.Rows.Add(new object[] { "Timn" });
table.Rows.Add(new object[] { "Fred" });
dataGridView1.DataSource = table;
if (!dataGridView1.Columns.Contains(m_choiceCol))
{
DataGridViewTextBoxColumn txtCol = new DataGridViewTextBoxColumn();
txtCol.Name = m_choiceCol;
dataGridView1.Columns.Add(txtCol);
}
List<Options> oList = new List<Options>();
oList.Add(new Options() { m_Index = 0, m_Text = "None" });
for (int i = 1; i < 10; i++)
{
oList.Add(new Options() { m_Index = i, m_Text = "Op" + i });
}
for (int i = 0; i < dataGridView1.Rows.Count - 1; i += 2)
{
DataGridViewComboBoxCell c = new DataGridViewComboBoxCell();
//Setup A
c.DataSource = oList;
c.Value = oList[0].m_Text;
c.ValueMember = "m_Text";
c.DisplayMember = "m_Text";
c.ValueType = typeof(string);
////Setup B
//c.DataSource = oList;
//c.Value = 0;
//c.ValueMember = "m_Index";
//c.DisplayMember = "m_Text";
//c.ValueType = typeof(int);
//Result is the same A or B
dataGridView1[m_choiceCol, i] = c;
}
}
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex >= 0 && e.RowIndex >= 0)
{
if (dataGridView1.CurrentCell.ColumnIndex == dataGridView1.Columns.IndexOf(dataGridView1.Columns[m_choiceCol]))
{
DataGridViewCell cell = dataGridView1[m_choiceCol, e.RowIndex];
dataGridView1.CurrentCell = cell;
dataGridView1.BeginEdit(true);
}
}
}
}
}
請注意,列索引號可以從按鈕按鈕的多個按鈕更改,所以我總是通過名稱而不是索引值引用列。我需要將David Hall的答案加入到我已經有ComboBoxes的演示中,以便他的答案非常有效。
謝謝... 首先,我嘗試使用SelectionChange事件,並做一些艱苦(及uggly太)工作,以避免堆棧溢出,因爲everytimes選擇改變它再次閃光。 但現在,我喜歡的FAQ最你的解決方案......並感謝+1。我更習慣於web而不是winforms,但無論如何都很好。 謝謝! – josecortesp 2009-11-29 03:59:13
這正是我所需要的。 Sort ... :)我實際上是試圖更新綁定到數據源的網格外部的單元格內容。我可以在屏幕上放置新值,但保存按鈕保存舊值。我需要在更新值之前放置一個CurrentCell和EndEdit()。你的回答讓我完全走上正軌。謝謝! – BoltBait 2009-12-08 20:21:25
避免需要問一個類似的問題 - ty – IbrarMumtaz 2012-11-17 15:58:06