我直接给你C#的罢
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Data;namespace MyControls
{
/// <summary>
/// DataGridComboBoxColumn 的摘要说明。
/// </summary>
public class DataGridComboBoxColumn : DataGridTextBoxColumn
{
public NoKeyUpCombo ColumnComboBox;
private int m_RowNum;
private bool m_IsEditing;
public static int m_RowCount;
private CurrencyManager m_Source;
/// <summary>
/// 构造器
/// </summary>
public DataGridComboBoxColumn()
{
m_Source = null;
m_IsEditing = false;
m_RowCount = -1;
ColumnComboBox = new NoKeyUpCombo();
ColumnComboBox.DropDownStyle = ComboBoxStyle.DropDownList;
ColumnComboBox.Leave += new EventHandler(LeaveComboBox);
ColumnComboBox.Enter += new EventHandler(ComboMadeCurrent);
// ColumnComboBox.SelectionChangeCommitted += new EventHandler(ComboStartEditing);
}
// private void ComboStartEditing(object sender, EventArgs e)
// {
// m_IsEditing = true;
// base.ColumnStartedEditing((Control) sender);
// }
private void ComboMadeCurrent(object sender, EventArgs e)
{
m_IsEditing = true;
}
private void LeaveComboBox(object sender, EventArgs e)
{
if(m_IsEditing)
{
SetColumnValueAtRow(m_Source,m_RowNum,ColumnComboBox.Text);
m_IsEditing = false;
Invalidate();
}
ColumnComboBox.Hide();
this.DataGridTableStyle.DataGrid.Scroll -= new EventHandler(HandleScroll);
}
/// <summary>
/// 拉动DataGrid滚动条时,触发的事件
/// </summary>
private void HandleScroll(object sender, EventArgs e)
{
//拉动DataGrid滚动条时,ComboBox隐藏
if(ColumnComboBox.Visible)
{
ColumnComboBox.Hide();
}
}
/// <summary>
/// 重写Edit方法
/// </summary>
protected override void Edit(CurrencyManager source, int rowNum, System.Drawing.Rectangle bounds, bool readOnly, string instantText, bool cellIsVisible)
{
base.Edit (source, rowNum, bounds, readOnly, instantText, cellIsVisible);
m_RowNum = rowNum;
m_Source = source;
ColumnComboBox.Parent = this.TextBox.Parent;
ColumnComboBox.Location = this.TextBox.Location;
ColumnComboBox.Size = new Size(this.TextBox.Width,this.TextBox.Height);
//编辑ComboBox时,下拉列表显示当前记录的文本
ColumnComboBox.SelectedIndex = ColumnComboBox.FindStringExact(this.TextBox.Text);
ColumnComboBox.Text= this.TextBox.Text;
this.TextBox.Visible = false;
ColumnComboBox.Visible = true;
//拉动DataGrid滚动条时,触发事件
this.DataGridTableStyle.DataGrid.Scroll += new EventHandler(HandleScroll);
ColumnComboBox.BringToFront();
ColumnComboBox.Focus();
}
protected override bool Commit(CurrencyManager dataSource, int rowNum)
{
if(m_IsEditing)
{
m_IsEditing = false;
SetColumnValueAtRow(dataSource, rowNum, ColumnComboBox.Text);
}
return true;
//return base.Commit (dataSource, rowNum);
}
protected override void SetColumnValueAtRow(CurrencyManager source, int rowNum, object value)
{
DataView dv = (DataView)this.ColumnComboBox.DataSource;
int rowCount = dv.Count;
int i = 0;
while(i < rowCount)
{
if(value.Equals(dv[i][this.ColumnComboBox.DisplayMember]))
break;
++i;
}
if(i < rowCount)
value = dv[i][this.ColumnComboBox.ValueMember];
else
value = DBNull.Value;
base.SetColumnValueAtRow (source, rowNum, value);
}
protected override object GetColumnValueAtRow(CurrencyManager source, int rowNum)
{
object s = base.GetColumnValueAtRow(source, rowNum);
DataView dv = (DataView)this.ColumnComboBox.DataSource;
int rowCount = dv.Count;
int i = 0;
//if things are slow, you could order your dataview
//& use binary search instead of this linear one
while (i < rowCount)
{
if( s.Equals( dv[i][this.ColumnComboBox.ValueMember]))
break;
++i;
}
if(i < rowCount)
return dv[i][this.ColumnComboBox.DisplayMember];
return DBNull.Value;
//return base.GetColumnValueAtRow (source, rowNum);
}
}
}
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Data;namespace MyControls
{
/// <summary>
/// DataGridComboBoxColumn 的摘要说明。
/// </summary>
public class DataGridComboBoxColumn : DataGridTextBoxColumn
{
public NoKeyUpCombo ColumnComboBox;
private int m_RowNum;
private bool m_IsEditing;
public static int m_RowCount;
private CurrencyManager m_Source;
/// <summary>
/// 构造器
/// </summary>
public DataGridComboBoxColumn()
{
m_Source = null;
m_IsEditing = false;
m_RowCount = -1;
ColumnComboBox = new NoKeyUpCombo();
ColumnComboBox.DropDownStyle = ComboBoxStyle.DropDownList;
ColumnComboBox.Leave += new EventHandler(LeaveComboBox);
ColumnComboBox.Enter += new EventHandler(ComboMadeCurrent);
// ColumnComboBox.SelectionChangeCommitted += new EventHandler(ComboStartEditing);
}
// private void ComboStartEditing(object sender, EventArgs e)
// {
// m_IsEditing = true;
// base.ColumnStartedEditing((Control) sender);
// }
private void ComboMadeCurrent(object sender, EventArgs e)
{
m_IsEditing = true;
}
private void LeaveComboBox(object sender, EventArgs e)
{
if(m_IsEditing)
{
SetColumnValueAtRow(m_Source,m_RowNum,ColumnComboBox.Text);
m_IsEditing = false;
Invalidate();
}
ColumnComboBox.Hide();
this.DataGridTableStyle.DataGrid.Scroll -= new EventHandler(HandleScroll);
}
/// <summary>
/// 拉动DataGrid滚动条时,触发的事件
/// </summary>
private void HandleScroll(object sender, EventArgs e)
{
//拉动DataGrid滚动条时,ComboBox隐藏
if(ColumnComboBox.Visible)
{
ColumnComboBox.Hide();
}
}
/// <summary>
/// 重写Edit方法
/// </summary>
protected override void Edit(CurrencyManager source, int rowNum, System.Drawing.Rectangle bounds, bool readOnly, string instantText, bool cellIsVisible)
{
base.Edit (source, rowNum, bounds, readOnly, instantText, cellIsVisible);
m_RowNum = rowNum;
m_Source = source;
ColumnComboBox.Parent = this.TextBox.Parent;
ColumnComboBox.Location = this.TextBox.Location;
ColumnComboBox.Size = new Size(this.TextBox.Width,this.TextBox.Height);
//编辑ComboBox时,下拉列表显示当前记录的文本
ColumnComboBox.SelectedIndex = ColumnComboBox.FindStringExact(this.TextBox.Text);
ColumnComboBox.Text= this.TextBox.Text;
this.TextBox.Visible = false;
ColumnComboBox.Visible = true;
//拉动DataGrid滚动条时,触发事件
this.DataGridTableStyle.DataGrid.Scroll += new EventHandler(HandleScroll);
ColumnComboBox.BringToFront();
ColumnComboBox.Focus();
}
protected override bool Commit(CurrencyManager dataSource, int rowNum)
{
if(m_IsEditing)
{
m_IsEditing = false;
SetColumnValueAtRow(dataSource, rowNum, ColumnComboBox.Text);
}
return true;
//return base.Commit (dataSource, rowNum);
}
protected override void SetColumnValueAtRow(CurrencyManager source, int rowNum, object value)
{
DataView dv = (DataView)this.ColumnComboBox.DataSource;
int rowCount = dv.Count;
int i = 0;
while(i < rowCount)
{
if(value.Equals(dv[i][this.ColumnComboBox.DisplayMember]))
break;
++i;
}
if(i < rowCount)
value = dv[i][this.ColumnComboBox.ValueMember];
else
value = DBNull.Value;
base.SetColumnValueAtRow (source, rowNum, value);
}
protected override object GetColumnValueAtRow(CurrencyManager source, int rowNum)
{
object s = base.GetColumnValueAtRow(source, rowNum);
DataView dv = (DataView)this.ColumnComboBox.DataSource;
int rowCount = dv.Count;
int i = 0;
//if things are slow, you could order your dataview
//& use binary search instead of this linear one
while (i < rowCount)
{
if( s.Equals( dv[i][this.ColumnComboBox.ValueMember]))
break;
++i;
}
if(i < rowCount)
return dv[i][this.ColumnComboBox.DisplayMember];
return DBNull.Value;
//return base.GetColumnValueAtRow (source, rowNum);
}
}
}
解决方案 »
- C#循环嵌套的优化,坐等!急急急!!!
- 现在C# winform 开发界面是不是都用WPF?
- 多个窗体引用同一控件?
- 关于c#很基本的问题?
- 请问如何代码访问DetailsView中的CommandField,即实现隐藏删除按钮等,谢谢
- 读取app.config的问题
- 软件工程
- IrisSkin2.dll改名
- 网站经常出错:error connecting: Timeout expired.
- 在OnPaint过程中绘图时,dotNet总是先用背景色擦除需要重画的区域,然后再用自己写的代码绘制。能否不让其擦除?即使区域很小,该区域仍
- 如何在C#动态调用EXECL的工作区?(急等)
- 用RSA算法生成密文之后如何进行再次编码将之转换为那种标准字符串
using System.Windows.Forms;namespace MyControls
{
/// <summary>
/// NoKeyUpCombo 的摘要说明。
/// </summary>
public class NoKeyUpCombo : ComboBox
{
private const int WM_KEYUP = 0x101; /// <summary>
/// 重写WndProc函数,屏蔽WM_KEYUP
/// </summary>
/// <param name="m"></param>
protected override void WndProc(ref Message m)
{
if(m.Msg == WM_KEYUP)
{
return;
}
base.WndProc (ref m);
}
}
}
这是原文地址,代码下载下来后DataGridBoundComboBox有个小Bug,参照我贴的代码改改就好了。
下面是我在我datagrid 中應用Checkbox,ComboBox,dateTimePicker 的例子,C#部分和我VB.net都有,希望對你有幫助....
VB.net 部分:
http://blog.csdn.net/zwxrain/archive/2005/01/19/258998.aspxC#部分:
http://blog.csdn.net/zwxrain/archive/2005/01/19/259100.aspx
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Data;namespace MyControls
{
/// <summary>
/// DataGridDatePickColumn 的摘要说明。
/// </summary>
public class DataGridDatePickColumn : DataGridTextBoxColumn
{
public DateTimePicker ColunmDatePicker;
private bool m_IsEditing;
private int m_RowNum;
public static int m_RowCount;
private CurrencyManager m_Source; /// <summary>
/// 构造器
/// </summary>
public DataGridDatePickColumn()
{
m_Source = null;
m_RowCount = -1;
m_IsEditing = false; ColunmDatePicker = new DateTimePicker();
ColunmDatePicker.Leave +=new EventHandler(ColunmDatePicker_Leave);
ColunmDatePicker.Enter +=new EventHandler(ColunmDatePicker_Enter);
}
/// <summary>
/// 失去焦点时显示为TextBox
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ColunmDatePicker_Leave(object sender, EventArgs e)
{
if(m_IsEditing)
{
SetColumnValueAtRow(m_Source,m_RowNum,ColunmDatePicker.Text);
m_IsEditing = false;
Invalidate();
}
ColunmDatePicker.Hide();
this.DataGridTableStyle.DataGrid.Scroll -= new EventHandler(DataGrid_Scroll);
}
/// <summary>
/// 获得焦点时显示为DatePicker
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ColunmDatePicker_Enter(object sender, EventArgs e)
{
m_IsEditing = true;
}
protected override void Edit(CurrencyManager source, int rowNum, Rectangle bounds, bool readOnly, string instantText, bool cellIsVisible)
{
base.Edit (source, rowNum, bounds, readOnly, instantText, cellIsVisible); m_RowNum = rowNum;
m_Source = source;
ColunmDatePicker.Parent = this.TextBox.Parent;
ColunmDatePicker.Location = this.TextBox.Location;
ColunmDatePicker.Size = new Size(this.TextBox.Width,this.TextBox.Height);
//编辑DatePicker时,下拉列表显示当前记录的文本
ColunmDatePicker.Text= this.TextBox.Text;
this.TextBox.Visible = false;
ColunmDatePicker.Visible = true;
//拉动DataGrid滚动条时,触发事件
this.DataGridTableStyle.DataGrid.Scroll +=new EventHandler(DataGrid_Scroll);
ColunmDatePicker.BringToFront();
ColunmDatePicker.Focus();
}
private void DataGrid_Scroll(object sender, EventArgs e)
{
//拉动DataGrid滚动条时,DatePicker隐藏
if(ColunmDatePicker.Visible)
{
ColunmDatePicker.Hide();
}
}
}//end class
}//end namespace
http://www.devexpress.com/Products/NET/XtraGrid/
可以说比较全了,没有源代码,可以看看设计的思路,直接用也可以