⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datagridcomboboxcolumn.cs

📁 VS2003+sqlserver 开发的客户关系管理系统,已有公司在使用,上传的是第一个版本.
💻 CS
字号:
using System;
using System.Windows.Forms;

namespace WindowsApplication1
{
	/// <summary>
	/// DataGridComboBoxColumn 的摘要说明。
	/// </summary>
	public class DataGridComboBoxColumn : DataGridTextBoxColumn
	{
		public NoKeyUpCombo ColumnComboBox;
		private System.Windows.Forms.CurrencyManager _source;
		private int _rowNum;
		private bool _isEditing;
		public static int _RowCount;
  
		public DataGridComboBoxColumn() : base()
		{
			_source = null;
			_isEditing = false;
			_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)
		{
			_isEditing = true;
			base.ColumnStartedEditing((Control) sender);
		}

		private void HandleScroll(object sender, EventArgs e)
		{
			if(ColumnComboBox.Visible)
				ColumnComboBox.Hide();

		}  
		private void LeaveComboBox(object sender, EventArgs e)
		{
			if(_isEditing)
			{
				SetColumnValueAtRow(_source, _rowNum, ColumnComboBox.Text);
				_isEditing = false;
				Invalidate();
			}
			ColumnComboBox.Hide();
			this.DataGridTableStyle.DataGrid.Scroll -= new EventHandler(HandleScroll);
   
		}

		protected override void Edit(System.Windows.Forms.CurrencyManager source, int rowNum, System.Drawing.Rectangle bounds, bool readOnly, string instantText, bool cellIsVisible)
		{
   

			base.Edit(source,rowNum, bounds, readOnly, instantText , cellIsVisible);

			_rowNum = rowNum;
			_source = source;
  
			ColumnComboBox.Parent = this.TextBox.Parent;
			ColumnComboBox.Location = this.TextBox.Location;
			ColumnComboBox.Size = new System.Drawing.Size(this.TextBox.Size.Width, ColumnComboBox.Size.Height);
			ColumnComboBox.SelectedIndex = ColumnComboBox.FindStringExact(this.TextBox.Text);
			ColumnComboBox.Text =  this.TextBox.Text;
			this.TextBox.Visible = false;
			ColumnComboBox.Visible = true;
			this.DataGridTableStyle.DataGrid.Scroll += new EventHandler(HandleScroll);
   
			ColumnComboBox.BringToFront();
			ColumnComboBox.Focus(); 
		}

		protected override bool Commit(System.Windows.Forms.CurrencyManager dataSource, int rowNum)
		{
			if(_isEditing)
			{
				_isEditing = false;
				SetColumnValueAtRow(dataSource, rowNum, ColumnComboBox.Text);
			}
			return true;
		}

		protected override void ConcedeFocus()
		{
			Console.WriteLine("ConcedeFocus");
			base.ConcedeFocus();
		}

		protected override object GetColumnValueAtRow(System.Windows.Forms.CurrencyManager source, int rowNum)
		{

			object s =  base.GetColumnValueAtRow(source, rowNum);
			System.Data.DataView dv = (System.Data.DataView)this.ColumnComboBox.DataSource;
			int rowCount = dv.Count;
			int i = 0;
			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;
		}

		protected override void SetColumnValueAtRow(System.Windows.Forms.CurrencyManager source, int rowNum, object value)
		{
			object s = value;

			System.Data.DataView dv = (System.Data.DataView)this.ColumnComboBox.DataSource;
			int rowCount = dv.Count;
			int i = 0;
			while (i < rowCount)
			{
				if( s.Equals( dv[i][this.ColumnComboBox.DisplayMember]))
					break;
				++i;
			}
			if(i < rowCount)
				s =  dv[i][this.ColumnComboBox.ValueMember];
			else
				s = DBNull.Value;
			base.SetColumnValueAtRow(source, rowNum, s);

		}
	}

 

	public class NoKeyUpCombo : ComboBox
	{
		private const int WM_KEYUP = 0x101;

		protected override void WndProc(ref System.Windows.Forms.Message m)
		{
			if(m.Msg == WM_KEYUP)
			{
				return;
			}
			base.WndProc(ref m);
		}
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -