怎樣在DATAGRID的欄中加入指定的控件,如某一欄加入combobox控件到DATAGRID中. CSDN上相关的贴子很多,你用DataGrid为关健字搜索一下,就有好多了! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 public class DataGridComboBox : DataGridTextBoxColumn { public ComboBox ColumnComboBox = new ComboBox(); public event myCustomerEventHandler ComboBoxInit = null;// private System.Windows.Forms.CurrencyManager _source = null;// private int _rowNum; private bool isEditing; public DataGridComboBox(System.Collections.Specialized.StringCollection initDatas) : base() { for(int i=0;i< initDatas.Count; i++) { ColumnComboBox.Items.Add(initDatas[i]); } ColumnComboBox.Visible = false; ColumnComboBox.DropDownStyle = ComboBoxStyle.DropDownList; } protected override void Abort(int rowNum) { isEditing = false; ColumnComboBox.Visible = false;// ColumnComboBox.SelectedIndexChanged -= // new EventHandler(ComboBoxSelectedChanged); Invalidate(); } private void ComboBoxSelectedChanged(object sender, EventArgs e) { this.isEditing = true; base.ColumnStartedEditing(ColumnComboBox); } protected override bool Commit (CurrencyManager dataSource, int rowNum) { ColumnComboBox.Bounds = Rectangle.Empty; // ColumnComboBox.SelectedIndexChanged -= // new EventHandler(ComboBoxSelectedChanged); if (!isEditing) return true; isEditing = false; try { ColumnComboBox.Update(); if(ColumnComboBox.SelectedIndex < 0) { Abort(rowNum); return false; } string value = ColumnComboBox.Items[ColumnComboBox.SelectedIndex].ToString(); SetColumnValueAtRow(dataSource, rowNum, value); } catch (Exception) { Abort(rowNum); return false; } Invalidate(); return true; } public void InitCombox(string Para) { } protected override void Edit( CurrencyManager source, int rowNum, Rectangle bounds, bool readOnly, string instantText, bool cellIsVisible) { MyEventArgs arg = new MyEventArgs(false,rowNum,""); if(this.ComboBoxInit != null) { this.ComboBoxInit(this.ColumnComboBox,arg); if(arg.MustReturn) return; } if(this.ColumnComboBox.Items.Count <= 0) return; object obj = GetColumnValueAtRow(source,rowNum); string value =string.Empty; if(obj != System.DBNull.Value) value = (string)obj; // else return; if (cellIsVisible) { ColumnComboBox.Bounds = new Rectangle (bounds.X , bounds.Y , bounds.Width, bounds.Height ); ColumnComboBox.Visible = true; ColumnComboBox.DropDownStyle = ComboBoxStyle.DropDownList; //if(value != "") ColumnComboBox.SelectedIndex = ColumnComboBox.FindString(value,-1); ColumnComboBox.SelectionChangeCommitted += new EventHandler(ColumnComboBox_SelectionChangeCommitted); // ColumnComboBox.SelectedIndexChanged += new EventHandler(ComboBoxSelectedChanged); ColumnComboBox.Focus(); ColumnComboBox.Leave+=new EventHandler(ColumnComboBox_Leave); if(ColumnComboBox.Text=="") ColumnComboBox.SelectedIndex=-1;// if( ColumnComboBox.SelectedIndex == -1)// ColumnComboBox.SelectedIndex = 0; isEditing = true; } else { // ColumnComboBox.Items[0] = value; ColumnComboBox.Visible = false; } if (ColumnComboBox.Visible) DataGridTableStyle.DataGrid.Invalidate(bounds); } protected override void SetDataGridInColumn(DataGrid value) {//放置ComboBox控件 base.SetDataGridInColumn(value); if(ColumnComboBox.Parent != null) ColumnComboBox.Parent.Controls.Remove(ColumnComboBox); if(value != null) value.Controls.Add(ColumnComboBox); } 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 obj = GetColumnValueAtRow(source,rowNum); string cbox = ""; if(obj != System.DBNull.Value) cbox = (string)obj; Rectangle rect= bounds; g.FillRectangle(backBrush,rect); rect.Offset(0, 2); rect.Height -= 2; g.DrawString(cbox, this.DataGridTableStyle.DataGrid.Font, foreBrush, rect); } private void ColumnComboBox_Leave(object sender, EventArgs e) {// if(this.ColumnComboBox.Focused == false)// return;// if(this.ColumnComboBox.SelectedIndex < 0)// {// this.ColumnComboBox.Focus();// MessageBox.Show("请选择数据!");// return;// }// if(isEditing)// { // SetColumnValueAtRow(_source, _rowNum, ColumnComboBox.Text);// isEditing = false;// Invalidate();// } ColumnComboBox.Hide(); } private void ColumnComboBox_SelectionChangeCommitted(object sender, EventArgs e) { object obj = ColumnComboBox.SelectedItem; if(ColumnComboBox.Items.Count > 0) ColumnComboBox.Text = ColumnComboBox.Items[ColumnComboBox.SelectedIndex == -1 ? 0 : ColumnComboBox.SelectedIndex].ToString(); // if(obj!= null) { // ColumnComboBox.Text = obj.ToString(); isEditing = true; base.ColumnStartedEditing((Control) sender); } } protected override void ConcedeFocus() { ColumnComboBox.Visible = false; } protected override void UpdateUI(CurrencyManager source, int rowNum, string instantText) { //ColumnComboBox.Text = GetText(GetColumnValueAtRow(source, rowNum)); if(instantText!=null) { ColumnComboBox.Text = instantText; } } } 接上:System.Collections.Specialized.StringCollection initDatas = new System.Collections.Specialized.StringCollection(); DataGridComboBox ComboBoxColumn = new DataGridComboBox(initDatas); ComboBoxColumn.HeaderText =headText; ComboBoxColumn.MappingName = mappingName; ComboBoxColumn.Width =width; ComboBoxColumn.NullText=""; ComboBoxColumn.ReadOnly=readOnly; ComboBoxColumn.ComboBoxInit+=new myCustomerEventHandler(ComboBoxColumn_ComboBoxInit); style.GridColumnStyles.Add(ComboBoxColumn); using System;using System.Drawing;using System.Collections;using System.Data;using System.Windows.Forms;namespace LongWin.UI.WinForm.Controls.ControlBase{ /// <summary> /// DataGridComboBoxColumn 的摘要说明:继承自DataGridColumnStyle,派生的类中,必须重写:Abort、Commit、Edit 和 Paint(两次) /// 有关注释选自帮助 /// 参考帮助文档:承载DateTimePicker 控件示例 /// 位置:ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemWindowsFormsDataGridColumnStyleClassTopic.htm /// </summary> public class DataGridComboBoxColumn:DataGridColumnStyle { private ComboBox pComboBox=new ComboBox(); private bool isEditing; private string valueMember=""; private string displayMember=""; DataTable _tableSource ; /// <summary> /// 构造方法 /// </summary> /// <param name="dt"></param> public DataGridComboBoxColumn():base() { pComboBox.Visible=false; } /// <summary> /// 加载数据,参数:数据表 /// </summary> /// <param name="dt"></param> public void BindData(object dataSource) { BindData(dataSource,displayMember,valueMember); } /// <summary> /// 加载数据,参数:数据表、显示字段名 /// </summary> /// <param name="dt"></param> /// <param name="sDisplayMember"></param> public void BindData(object dataSource,string sDisplayMember) { BindData(dataSource,sDisplayMember,sDisplayMember); } string defaultFilter=string.Empty; /// <summary> /// 加载数据,参数:数据表、显示字段名、值字段名 /// </summary> /// <param name="dt"></param> /// <param name="sDisplayMember"></param> /// <param name="sValueMember"></param> public void BindData(object dataSource,string sDisplayMember,string sValueMember) { try { if(dataSource is DataTable) { _tableSource=dataSource as DataTable; } else if(dataSource is DataSet) { DataSet ds=dataSource as DataSet; _tableSource=ds.Tables[0]; } else if(dataSource is DataView) { DataView dv=dataSource as DataView; defaultFilter=dv.RowFilter; //记录默认筛选条件 _tableSource=dv.Table; } if(sDisplayMember.Trim()=="") { throw new Exception("existingDipplay 参数不能为空!"); } else { if(sValueMember.Trim()=="") sValueMember=sDisplayMember; this.pComboBox.DropDownStyle=ComboBoxStyle.DropDownList; this.pComboBox.DataSource = dataSource ; this.pComboBox.DisplayMember = this.DisplayMember ; this.pComboBox.ValueMember = this.ValueMember ; } } catch(Exception ex) { throw ex; } } //值对应的数据字段名 public string ValueMember { get{ return valueMember;} set{valueMember=value;} } //显示对应的数据字段名 public string DisplayMember { get{return displayMember;} set{displayMember=value;} } /// <summary> /// 在派生类中被重写时,将启动一个请求来中断编辑过程 /// </summary> /// <param name="rowNum"></param> protected override void Abort(int rowNum) { isEditing = false; pComboBox.GotFocus-= new EventHandler(pComboBox_GotFocus); Invalidate(); } public event EventHandlerComboBoxColummDataChanging DataChanging; /// <summary> /// 在派生类中被重写时,将启动一个请求来完成编辑过程 /// </summary> /// <param name="dataSource"></param> /// <param name="rowNum"></param> /// <returns></returns> protected override bool Commit(CurrencyManager dataSource, int rowNum) { pComboBox.Bounds = Rectangle.Empty; if (!isEditing) return true; isEditing = false; try { try { if(this.DataChanging!=null) { this.DataChanging(this.pComboBox.SelectedValue); } } catch(Exception er) { MessageBox.Show(er.Message); return false; } SetColumnValueAtRow(dataSource, rowNum, this.pComboBox.SelectedValue ); } catch (Exception) { Abort(rowNum); return false; } Invalidate(); return true; } /// <summary> /// 准备单元格以便编辑值 /// </summary> /// <param name="source"></param> /// <param name="rowNum"></param> /// <param name="bounds"></param> /// <param name="readOnly"></param> /// <param name="instantText"></param> /// <param name="cellIsVisible"></param> protected override void Edit(CurrencyManager source, int rowNum, Rectangle bounds, bool readOnly, string instantText, bool cellIsVisible) { object sValue; if(GetColumnValueAtRow(source, rowNum) is System.DBNull) { sValue=""; } else { sValue = GetColumnValueAtRow(source, rowNum) ; } if (cellIsVisible && !this.ReadOnly) { pComboBox.Bounds = new Rectangle(bounds.X + 1, bounds.Y + 1, bounds.Width - 2, bounds.Height - 2); pComboBox.SelectedValue = sValue ; pComboBox.Visible = true; pComboBox.GotFocus+=new EventHandler(pComboBox_GotFocus); } else { pComboBox.Visible = false; } if (pComboBox.Visible) DataGridTableStyle.DataGrid.Invalidate(bounds); } /// <summary> /// 获取指定值的宽度和高度 /// </summary> /// <param name="g"></param> /// <param name="value"></param> /// <returns></returns> protected override Size GetPreferredSize(Graphics g, object value) { return new Size(100, pComboBox.PreferredHeight + 2); } /// <summary> /// 将获取一行的最小高度 /// </summary> /// <returns></returns> protected override int GetMinimumHeight() { return pComboBox.PreferredHeight + 2; } /// <summary> /// 获取自动调整列的大小所用的高度 /// </summary> /// <param name="g"></param> /// <param name="value"></param> /// <returns></returns> protected override int GetPreferredHeight(Graphics g, object value) { return pComboBox.PreferredHeight + 2; } /// <summary> /// 绘制列 /// </summary> /// <param name="g"></param> /// <param name="bounds"></param> /// <param name="source"></param> /// <param name="rowNum"></param> 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 selectedValue =GetColumnValueAtRow(source, rowNum) ; if(selectedValue is System.DBNull) { selectedValue = ""; } else { if(selectedValue is System.Boolean ) selectedValue = Convert.ToInt32(selectedValue).ToString(); string filter=string.Format("{0}='{1}'" , this.ValueMember , selectedValue); if(this._tableSource.Columns[this.valueMember].DataType==typeof(int) || this._tableSource.Columns[this.valueMember].DataType==typeof(short)) { if(selectedValue.ToString().Length==0) selectedValue=0; filter=string.Format("{0}={1}" , this.ValueMember , selectedValue); } filter+= ((this.defaultFilter.Length>0) ? " And " + this.defaultFilter : ""); DataRow[] dr = _tableSource.Select(filter); if(dr != null && dr.Length ==1) selectedValue = dr[0][this.DisplayMember].ToString() ; else selectedValue=string.Empty; } int rows=Convert.ToInt32(bounds.Height/this.FontHeight); if(rows==0) { rows=1; } int dec=Convert.ToInt32((bounds.Height-this.FontHeight*rows)/2); if(dec<0) { dec=0; } Rectangle rect = new Rectangle(bounds.X,bounds.Y+dec,bounds.Width,bounds.Height-dec*2); g.FillRectangle(backBrush,bounds); rect.Offset(0, 2); rect.Height -= 2; g.DrawString(selectedValue.ToString() ,this.DataGridTableStyle.DataGrid.Font, foreBrush,rect); } /// <summary> /// 设置列的 System.Windows.Forms.DataGrid /// </summary> /// <param name="value"></param> protected override void SetDataGridInColumn(DataGrid value) { base.SetDataGridInColumn(value); if (pComboBox.Parent != null) { pComboBox.Parent.Controls.Remove (pComboBox); } if (value != null) { value.Controls.Add(pComboBox); } } private void pComboBox_GotFocus(object sender, EventArgs e) { this.isEditing = true; base.ColumnStartedEditing(pComboBox); } } public delegate void EventHandlerComboBoxColummDataChanging(object newValue);} 添加一个模板列<asp:TemplateColumn HeaderText="父类别"> <ItemTemplate> <asp:Label runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.父类别") %>' ID="Label6"> </asp:Label> </ItemTemplate> <EditItemTemplate> <asp:DropDownList id="ddlParent" runat="server" Width="80"></asp:DropDownList> </EditItemTemplate> </asp:TemplateColumn>后台代码:private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) { if (e.Item.ItemType == ListItemType.EditItem ) { string sParentType=(string)DataBinder.Eval(e.Item.DataItem, "父类别"); DropDownList ddlParentType=(DropDownList)e.Item.FindControl("ddlParent"); ddlParentType.DataTextField="sTypeName"; ddlParentType.DataValueField="nTypeID";//得到DropDownList的数据集 ddlParentType.DataSource=getParentType(); ddlParentType.DataBind(); ddlParentType.Items.FindByText(sParentType).Selected=true; } 求解。VS2010打包后的项目,在安装时报错。。。。 ListView问题 listbox控件问题! 如何获取java VM版本 c#取何截取字符串 TreeView 节点显示多行文字,愚翁进来帮忙,谢! WinFrom中的DateTime的WebFrom中的DateTime問題,請指教 对控件怎么截图 请教正则,匹配换行时(最后一行没有回车符的问题) c# 有没有哪个控件,可以拉一个滚动条来改变Textbox的数字? C#如何开发一个类似BT下载一样的工具?就是点对点传输 重画窗体???????
{
public ComboBox ColumnComboBox = new ComboBox();
public event myCustomerEventHandler ComboBoxInit = null;
// private System.Windows.Forms.CurrencyManager _source = null;
// private int _rowNum; private bool isEditing;
public DataGridComboBox(System.Collections.Specialized.StringCollection initDatas) : base()
{
for(int i=0;i< initDatas.Count; i++)
{
ColumnComboBox.Items.Add(initDatas[i]);
}
ColumnComboBox.Visible = false;
ColumnComboBox.DropDownStyle = ComboBoxStyle.DropDownList;
}
protected override void Abort(int rowNum)
{
isEditing = false;
ColumnComboBox.Visible = false;
// ColumnComboBox.SelectedIndexChanged -=
// new EventHandler(ComboBoxSelectedChanged);
Invalidate();
}
private void ComboBoxSelectedChanged(object sender, EventArgs e)
{
this.isEditing = true;
base.ColumnStartedEditing(ColumnComboBox);
} protected override bool Commit
(CurrencyManager dataSource, int rowNum)
{
ColumnComboBox.Bounds = Rectangle.Empty;
// ColumnComboBox.SelectedIndexChanged -=
// new EventHandler(ComboBoxSelectedChanged); if (!isEditing)
return true;
isEditing = false;
try
{
ColumnComboBox.Update();
if(ColumnComboBox.SelectedIndex < 0)
{
Abort(rowNum);
return false;
}
string value = ColumnComboBox.Items[ColumnComboBox.SelectedIndex].ToString();
SetColumnValueAtRow(dataSource, rowNum, value);
}
catch (Exception)
{
Abort(rowNum);
return false;
} Invalidate();
return true;
}
public void InitCombox(string Para)
{ }
protected override void Edit(
CurrencyManager source,
int rowNum,
Rectangle bounds,
bool readOnly,
string instantText,
bool cellIsVisible)
{
MyEventArgs arg = new MyEventArgs(false,rowNum,"");
if(this.ComboBoxInit != null)
{
this.ComboBoxInit(this.ColumnComboBox,arg);
if(arg.MustReturn)
return;
}
if(this.ColumnComboBox.Items.Count <= 0)
return;
object obj = GetColumnValueAtRow(source,rowNum);
string value =string.Empty;
if(obj != System.DBNull.Value)
value = (string)obj;
// else return; if (cellIsVisible)
{
ColumnComboBox.Bounds = new Rectangle
(bounds.X , bounds.Y ,
bounds.Width, bounds.Height );
ColumnComboBox.Visible = true;
ColumnComboBox.DropDownStyle = ComboBoxStyle.DropDownList;
//if(value != "")
ColumnComboBox.SelectedIndex = ColumnComboBox.FindString(value,-1);
ColumnComboBox.SelectionChangeCommitted += new EventHandler(ColumnComboBox_SelectionChangeCommitted);
// ColumnComboBox.SelectedIndexChanged += new EventHandler(ComboBoxSelectedChanged);
ColumnComboBox.Focus();
ColumnComboBox.Leave+=new EventHandler(ColumnComboBox_Leave);
if(ColumnComboBox.Text=="")
ColumnComboBox.SelectedIndex=-1;
// if( ColumnComboBox.SelectedIndex == -1)
// ColumnComboBox.SelectedIndex = 0;
isEditing = true;
}
else
{
// ColumnComboBox.Items[0] = value;
ColumnComboBox.Visible = false;
} if (ColumnComboBox.Visible)
DataGridTableStyle.DataGrid.Invalidate(bounds);
} protected override void SetDataGridInColumn(DataGrid value)
{//放置ComboBox控件
base.SetDataGridInColumn(value);
if(ColumnComboBox.Parent != null)
ColumnComboBox.Parent.Controls.Remove(ColumnComboBox);
if(value != null)
value.Controls.Add(ColumnComboBox);
} 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 obj = GetColumnValueAtRow(source,rowNum);
string cbox = "";
if(obj != System.DBNull.Value)
cbox = (string)obj;
Rectangle rect= bounds;
g.FillRectangle(backBrush,rect);
rect.Offset(0, 2);
rect.Height -= 2;
g.DrawString(cbox,
this.DataGridTableStyle.DataGrid.Font,
foreBrush, rect);
} private void ColumnComboBox_Leave(object sender, EventArgs e)
{
// if(this.ColumnComboBox.Focused == false)
// return;
// if(this.ColumnComboBox.SelectedIndex < 0)
// {
// this.ColumnComboBox.Focus();
// MessageBox.Show("请选择数据!");
// return;
// }
// if(isEditing)
// {
// SetColumnValueAtRow(_source, _rowNum, ColumnComboBox.Text);
// isEditing = false;
// Invalidate();
// }
ColumnComboBox.Hide(); } private void ColumnComboBox_SelectionChangeCommitted(object sender, EventArgs e)
{
object obj = ColumnComboBox.SelectedItem;
if(ColumnComboBox.Items.Count > 0)
ColumnComboBox.Text = ColumnComboBox.Items[ColumnComboBox.SelectedIndex == -1 ? 0 : ColumnComboBox.SelectedIndex].ToString();
// if(obj!= null)
{
// ColumnComboBox.Text = obj.ToString(); isEditing = true;
base.ColumnStartedEditing((Control) sender);
}
}
protected override void ConcedeFocus()
{
ColumnComboBox.Visible = false;
}
protected override void UpdateUI(CurrencyManager source, int rowNum, string instantText)
{
//ColumnComboBox.Text = GetText(GetColumnValueAtRow(source, rowNum));
if(instantText!=null)
{
ColumnComboBox.Text = instantText;
}
}
}
ComboBoxColumn.HeaderText =headText;
ComboBoxColumn.MappingName = mappingName;
ComboBoxColumn.Width =width;
ComboBoxColumn.NullText="";
ComboBoxColumn.ReadOnly=readOnly;
ComboBoxColumn.ComboBoxInit+=new myCustomerEventHandler(ComboBoxColumn_ComboBoxInit);
style.GridColumnStyles.Add(ComboBoxColumn);
using System.Drawing;
using System.Collections;
using System.Data;
using System.Windows.Forms;namespace LongWin.UI.WinForm.Controls.ControlBase
{
/// <summary>
/// DataGridComboBoxColumn 的摘要说明:继承自DataGridColumnStyle,派生的类中,必须重写:Abort、Commit、Edit 和 Paint(两次)
/// 有关注释选自帮助
/// 参考帮助文档:承载DateTimePicker 控件示例
/// 位置:ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemWindowsFormsDataGridColumnStyleClassTopic.htm
/// </summary>
public class DataGridComboBoxColumn:DataGridColumnStyle
{
private ComboBox pComboBox=new ComboBox();
private bool isEditing;
private string valueMember="";
private string displayMember="";
DataTable _tableSource ; /// <summary>
/// 构造方法
/// </summary>
/// <param name="dt"></param>
public DataGridComboBoxColumn():base()
{
pComboBox.Visible=false;
} /// <summary>
/// 加载数据,参数:数据表
/// </summary>
/// <param name="dt"></param>
public void BindData(object dataSource)
{
BindData(dataSource,displayMember,valueMember);
} /// <summary>
/// 加载数据,参数:数据表、显示字段名
/// </summary>
/// <param name="dt"></param>
/// <param name="sDisplayMember"></param>
public void BindData(object dataSource,string sDisplayMember)
{
BindData(dataSource,sDisplayMember,sDisplayMember);
} string defaultFilter=string.Empty;
/// <summary>
/// 加载数据,参数:数据表、显示字段名、值字段名
/// </summary>
/// <param name="dt"></param>
/// <param name="sDisplayMember"></param>
/// <param name="sValueMember"></param>
public void BindData(object dataSource,string sDisplayMember,string sValueMember)
{
try
{
if(dataSource is DataTable)
{
_tableSource=dataSource as DataTable;
}
else if(dataSource is DataSet)
{
DataSet ds=dataSource as DataSet;
_tableSource=ds.Tables[0];
}
else if(dataSource is DataView)
{
DataView dv=dataSource as DataView;
defaultFilter=dv.RowFilter; //记录默认筛选条件 _tableSource=dv.Table;
} if(sDisplayMember.Trim()=="")
{
throw new Exception("existingDipplay 参数不能为空!");
}
else
{
if(sValueMember.Trim()=="")
sValueMember=sDisplayMember;
this.pComboBox.DropDownStyle=ComboBoxStyle.DropDownList;
this.pComboBox.DataSource = dataSource ;
this.pComboBox.DisplayMember = this.DisplayMember ;
this.pComboBox.ValueMember = this.ValueMember ;
}
}
catch(Exception ex)
{
throw ex;
}
} //值对应的数据字段名
public string ValueMember
{
get{ return valueMember;}
set{valueMember=value;}
} //显示对应的数据字段名
public string DisplayMember
{
get{return displayMember;}
set{displayMember=value;}
} /// <summary>
/// 在派生类中被重写时,将启动一个请求来中断编辑过程
/// </summary>
/// <param name="rowNum"></param>
protected override void Abort(int rowNum)
{
isEditing = false;
pComboBox.GotFocus-= new EventHandler(pComboBox_GotFocus);
Invalidate();
}
/// <summary>
/// 在派生类中被重写时,将启动一个请求来完成编辑过程
/// </summary>
/// <param name="dataSource"></param>
/// <param name="rowNum"></param>
/// <returns></returns>
protected override bool Commit(CurrencyManager dataSource, int rowNum)
{
pComboBox.Bounds = Rectangle.Empty;
if (!isEditing)
return true; isEditing = false; try
{
try
{
if(this.DataChanging!=null)
{
this.DataChanging(this.pComboBox.SelectedValue);
}
}
catch(Exception er)
{
MessageBox.Show(er.Message);
return false;
}
SetColumnValueAtRow(dataSource, rowNum, this.pComboBox.SelectedValue );
}
catch (Exception)
{
Abort(rowNum);
return false;
} Invalidate();
return true;
} /// <summary>
/// 准备单元格以便编辑值
/// </summary>
/// <param name="source"></param>
/// <param name="rowNum"></param>
/// <param name="bounds"></param>
/// <param name="readOnly"></param>
/// <param name="instantText"></param>
/// <param name="cellIsVisible"></param>
protected override void Edit(CurrencyManager source, int rowNum, Rectangle bounds, bool readOnly, string instantText, bool cellIsVisible)
{
object sValue; if(GetColumnValueAtRow(source, rowNum) is System.DBNull)
{
sValue="";
}
else
{
sValue = GetColumnValueAtRow(source, rowNum) ;
} if (cellIsVisible && !this.ReadOnly)
{
pComboBox.Bounds = new Rectangle(bounds.X + 1, bounds.Y + 1, bounds.Width - 2, bounds.Height - 2);
pComboBox.SelectedValue = sValue ;
pComboBox.Visible = true;
pComboBox.GotFocus+=new EventHandler(pComboBox_GotFocus);
}
else
{
pComboBox.Visible = false;
} if (pComboBox.Visible)
DataGridTableStyle.DataGrid.Invalidate(bounds);
} /// <summary>
/// 获取指定值的宽度和高度
/// </summary>
/// <param name="g"></param>
/// <param name="value"></param>
/// <returns></returns>
protected override Size GetPreferredSize(Graphics g, object value)
{
return new Size(100, pComboBox.PreferredHeight + 2);
} /// <summary>
/// 将获取一行的最小高度
/// </summary>
/// <returns></returns>
protected override int GetMinimumHeight()
{
return pComboBox.PreferredHeight + 2;
} /// <summary>
/// 获取自动调整列的大小所用的高度
/// </summary>
/// <param name="g"></param>
/// <param name="value"></param>
/// <returns></returns>
protected override int GetPreferredHeight(Graphics g, object value)
{
return pComboBox.PreferredHeight + 2;
} /// <summary>
/// 绘制列
/// </summary>
/// <param name="g"></param>
/// <param name="bounds"></param>
/// <param name="source"></param>
/// <param name="rowNum"></param>
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 selectedValue =GetColumnValueAtRow(source, rowNum) ;
if(selectedValue is System.DBNull)
{
selectedValue = "";
}
else
{
if(selectedValue is System.Boolean )
selectedValue = Convert.ToInt32(selectedValue).ToString(); string filter=string.Format("{0}='{1}'" , this.ValueMember , selectedValue);
if(this._tableSource.Columns[this.valueMember].DataType==typeof(int)
|| this._tableSource.Columns[this.valueMember].DataType==typeof(short))
{
if(selectedValue.ToString().Length==0)
selectedValue=0;
filter=string.Format("{0}={1}" , this.ValueMember , selectedValue);
} filter+= ((this.defaultFilter.Length>0) ? " And " + this.defaultFilter : ""); DataRow[] dr = _tableSource.Select(filter);
if(dr != null && dr.Length ==1)
selectedValue = dr[0][this.DisplayMember].ToString() ;
else
selectedValue=string.Empty;
} int rows=Convert.ToInt32(bounds.Height/this.FontHeight);
if(rows==0)
{
rows=1;
}
int dec=Convert.ToInt32((bounds.Height-this.FontHeight*rows)/2); if(dec<0)
{
dec=0;
} Rectangle rect = new Rectangle(bounds.X,bounds.Y+dec,bounds.Width,bounds.Height-dec*2); g.FillRectangle(backBrush,bounds);
rect.Offset(0, 2);
rect.Height -= 2;
g.DrawString(selectedValue.ToString() ,this.DataGridTableStyle.DataGrid.Font, foreBrush,rect);
} /// <summary>
/// 设置列的 System.Windows.Forms.DataGrid
/// </summary>
/// <param name="value"></param>
protected override void SetDataGridInColumn(DataGrid value)
{
base.SetDataGridInColumn(value);
if (pComboBox.Parent != null)
{
pComboBox.Parent.Controls.Remove
(pComboBox);
}
if (value != null)
{
value.Controls.Add(pComboBox);
}
} private void pComboBox_GotFocus(object sender, EventArgs e)
{
this.isEditing = true;
base.ColumnStartedEditing(pComboBox);
}
}
public delegate void EventHandlerComboBoxColummDataChanging(object newValue);
}
<asp:TemplateColumn HeaderText="父类别">
<ItemTemplate>
<asp:Label runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.父类别") %>' ID="Label6">
</asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList id="ddlParent" runat="server" Width="80"></asp:DropDownList>
</EditItemTemplate>
</asp:TemplateColumn>后台代码:
private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.EditItem )
{
string sParentType=(string)DataBinder.Eval(e.Item.DataItem, "父类别");
DropDownList ddlParentType=(DropDownList)e.Item.FindControl("ddlParent"); ddlParentType.DataTextField="sTypeName";
ddlParentType.DataValueField="nTypeID";
//得到DropDownList的数据集
ddlParentType.DataSource=getParentType();
ddlParentType.DataBind(); ddlParentType.Items.FindByText(sParentType).Selected=true;
}