class DataGridComboBoxTableViewColumn: DataGridColumnStyle
{//与DataGridComboBoxColumn不同,显示时使用DataTable,下拉时使用DataView
private ComboBox myComboBox = new ComboBox ();
private DataView ChoiceDataViewSource;
private DataView TableDataViewSource;
private string ChoiceDisplayField;
private string ChoiceValueField;
private bool isEditing;
public DataGridComboBoxTableViewColumn(DataView ChoiceDataViewSource,string ChoiceDisplayField,string ChoiceValueField) : base()
{
this.ChoiceDataViewSource =ChoiceDataViewSource;
TableDataViewSource=new System.Data .DataView (ChoiceDataViewSource.Table);
this.ChoiceDisplayField =ChoiceDisplayField;
this.ChoiceValueField =ChoiceValueField;
myComboBox.DropDownStyle =System.Windows .Forms .ComboBoxStyle .DropDownList ;
myComboBox.Visible = false;
myComboBox.DataSource =this.ChoiceDataViewSource;
myComboBox.DisplayMember= this.ChoiceDisplayField;
myComboBox.ValueMember =this.ChoiceValueField;
}
protected override void Abort(int rowNum)
{
isEditing = false;
myComboBox.SelectedIndexChanged -=
new EventHandler(ComboBoxSelectedIndexChanged );
Invalidate();
}
protected override bool Commit
(CurrencyManager dataSource, int rowNum)
{
myComboBox.Bounds = Rectangle.Empty;
myComboBox.SelectedIndexChanged -=
new EventHandler(ComboBoxSelectedIndexChanged );
if (!isEditing)
return true;
isEditing = false;
try
{
System.Object value = myComboBox.SelectedValue;
SetColumnValueAtRow(dataSource, rowNum, value);
}
catch (Exception)
{
Abort(rowNum);
return false;
}
Invalidate();
return true;
}
protected override void Edit(
CurrencyManager source,
int rowNum,
Rectangle bounds,
bool readOnly,
string instantText,
bool cellIsVisible)
{
object value =GetColumnValueAtRow(source, rowNum);
if (cellIsVisible)
{
myComboBox.Bounds = new Rectangle
(bounds.X + 2, bounds.Y + 2,
bounds.Width - 4, bounds.Height - 4);
int i= Find (value);
if (myComboBox.Items .Count >i)
{
myComboBox.SelectedIndex =i;
}
myComboBox.Visible = true;
myComboBox.SelectedIndexChanged +=
new EventHandler(ComboBoxSelectedIndexChanged );
}
else
{
myComboBox.SelectedIndex =this.Find (value);
myComboBox.Visible = false;
}
if (myComboBox.Visible)
DataGridTableStyle.DataGrid.Invalidate(bounds);
}
protected int Find(System.Object value)
{
int int1;
int int2;
int2=TableDataViewSource.Count ;
if (int2<=0)
{
return -1;
}
for (int1=0;int1<int2;int1++)
{
if (TableDataViewSource[int1][this.myComboBox .ValueMember ].ToString ().Trim ()==value.ToString ().Trim ())
{
return int1;
}
}
return -1;
}
protected override Size GetPreferredSize(
Graphics g,
object value)
{
return new Size(100, myComboBox.PreferredHeight+ 4);
}
protected override int GetMinimumHeight()
{
return myComboBox.PreferredHeight + 4;
}
protected override int GetPreferredHeight(Graphics g,
object value)
{
return myComboBox.PreferredHeight + 4;
}
protected override void Paint(Graphics g,
Rectangle bounds,
CurrencyManager source,
int rowNum)
{
Paint(g, bounds, source, rowNum, false);
}
protected override void Paint(
Graphics g,
Rectangle bounds,
CurrencyManager source,
int rowNum,
bool alignToRight)
{
Paint(
g,bounds,
source,
rowNum,
Brushes.Red,
Brushes.Blue,
alignToRight);
}
protected override void Paint(
Graphics g,
Rectangle bounds,
CurrencyManager source,
int rowNum,
Brush backBrush,
Brush foreBrush,
bool alignToRight)
{
object value=GetColumnValueAtRow(source, rowNum);
int int1=Find (value);
string display="";
if (int1>=0)
{
display=this.TableDataViewSource [int1][this.myComboBox .DisplayMember ].ToString ();
}
Rectangle rect = bounds;
g.FillRectangle(backBrush,rect);
rect.Offset(0, 2);
rect.Height -= 2;
g.DrawString(display,
this.DataGridTableStyle.DataGrid.Font,
foreBrush, rect);
}
protected override void SetDataGridInColumn(DataGrid value)
{
base.SetDataGridInColumn(value);
if (myComboBox.Parent != null)
{
myComboBox.Parent.Controls.Remove
(myComboBox);
}
if (value != null)
{
value.Controls.Add(myComboBox);
}
}
private void ComboBoxSelectedIndexChanged(object sender, EventArgs e)
{
this.isEditing = true;
base.ColumnStartedEditing(myComboBox);
}
}