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

📄 datagridcomboboxcolumn.cs

📁 c#语音酒店管理的毕业设计 适合于初级水平的学习
💻 CS
字号:
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Data;
namespace 中小型酒店管理信息系统
{
	public class DataGridComboBox:ComboBox
	{
		// 继承下拉列表框类
		public DataGridComboBox()
		{
		}
		private void InitializeComponent()
		{

		}		
	}
	public class DataGridComboBoxColumn:DataGridColumnStyle
	{
		//在dataGrid中创建一个下拉列表框,dataGrid中的这一列都拥有相同的下拉选项 
		private int xMargin = 2;
		private int yMargin = 1;
		private DataGridComboBox Combo;
		private string _DisplayMember;
		private string _ValueMember;
		//获取编辑状态
		private string OldVal=new string(string.Empty.ToCharArray());
		private bool InEdit= false;
		// 根据顺序号建立一个新的下拉列 
		public DataGridComboBoxColumn(DataTable DataSource, int DisplayMember,int ValueMember)
		{
			Combo = new DataGridComboBox();
			_DisplayMember = DataSource.Columns[DisplayMember].ToString();
			_ValueMember = DataSource.Columns[ValueMember].ToString();
			
			Combo.Visible=false;
			Combo.DataSource = DataSource;
			Combo.DisplayMember = _DisplayMember;
			Combo.ValueMember = _ValueMember;
			Combo.DropDownStyle = ComboBoxStyle.DropDown;
		}
		//根据字符串建立新的下拉列
		public DataGridComboBoxColumn(DataTable DataSource,string DisplayMember,string ValueMember)
		{
			Combo = new DataGridComboBox();
			Combo.Visible = false;
			Combo.DataSource = DataSource;
			Combo.DisplayMember = DisplayMember;
			Combo.ValueMember = ValueMember;
			Combo.DropDownStyle = ComboBoxStyle.DropDown;
		}
		// 重写DataGridColumnStyle中的方法
		// 重写Abort
		protected override void Abort(int RowNum)
		{
			System.Diagnostics.Debug.WriteLine("Abort()");
			RollBack();
			HideComboBox();
			EndEdit();
		}
		// 重写Commit
		protected override bool Commit(CurrencyManager DataSource,int RowNum)
		{
			HideComboBox();
			if(!InEdit)
			{
				return true;
			}
			try
			{
				//如果是: Combo.DropDownStyle = ComboBoxStyle.DropDownList;
				//object Value = Combo.SelectedValue;
				//如果是: Combo.DropDownStyle = ComboBoxStyle.DropDown;
				object Value = Combo.Text;
				if(NullText.Equals(Value))
				{
					Value = System.Convert.DBNull; 
				}
				SetColumnValueAtRow(DataSource, RowNum, Value);
			}
			catch
			{
				RollBack();
				return false;	
			}
			
			this.EndEdit();
			return true;
		}
		//移出焦点
		protected override void ConcedeFocus()
		{
			Combo.Visible=false;
		}
		//重写编辑dataGrid的方法edit
		protected override void Edit(CurrencyManager Source ,int Rownum,Rectangle Bounds, bool ReadOnly,string InstantText, bool CellIsVisible)
		{
			Combo.Text = string.Empty;
			Rectangle OriginalBounds = Bounds;
			OldVal = Combo.Text;
	
			if(CellIsVisible)
			{
				Bounds.Offset(xMargin, yMargin);
				Bounds.Width -= xMargin * 2;
				Bounds.Height -= yMargin;
				Combo.Bounds = Bounds;
				Combo.Visible = true;
			}
			else
			{
				Combo.Bounds = OriginalBounds;
				Combo.Visible = false;
			}
			
			Combo.SelectedValue = GetText(GetColumnValueAtRow(Source, Rownum));
			
			if(InstantText!=null)
			{
				Combo.SelectedValue = InstantText;
			}
			Combo.RightToLeft = this.DataGridTableStyle.DataGrid.RightToLeft;			
			if(InstantText==null)
			{
				Combo.SelectAll();			
			}
			else
			{
				int End = Combo.Text.Length;
				Combo.Select(End, 0);
			}
			if(Combo.Visible)
			{
				DataGridTableStyle.DataGrid.Invalidate(OriginalBounds);
			}

			InEdit = true;
		}
		protected override int GetMinimumHeight()
		{
			// 设置combobox的最小高度
			return Combo.PreferredHeight + yMargin;
		}
		protected override int GetPreferredHeight(Graphics g ,object Value)
		{
			System.Diagnostics.Debug.WriteLine("GetPreferredHeight()");
			int NewLineIndex  = 0;
			int NewLines = 0;
			string ValueString = this.GetText(Value);
			do
			{
				NewLineIndex = ValueString.IndexOf("r\n", NewLineIndex + 1);
				NewLines += 1;
			}while(NewLineIndex != -1);
			return FontHeight * NewLines + yMargin;
		}
		protected override Size GetPreferredSize(Graphics g, object Value)
		{
			Size Extents = Size.Ceiling(g.MeasureString(GetText(Value), this.DataGridTableStyle.DataGrid.Font));
			Extents.Width += xMargin * 2 + DataGridTableGridLineWidth ;
			Extents.Height += yMargin;
			return Extents;
		}
		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)
		{
			string Text = GetText(GetColumnValueAtRow(Source, RowNum));
			PaintText(g, Bounds, Text, AlignToRight);
		}
		protected override void Paint(Graphics g,Rectangle Bounds,CurrencyManager Source,int RowNum,Brush BackBrush ,Brush ForeBrush ,bool AlignToRight)
		{
			string Text = GetText(GetColumnValueAtRow(Source, RowNum));
			PaintText(g, Bounds, Text, BackBrush, ForeBrush, AlignToRight);
		}
		protected override void SetDataGridInColumn(DataGrid Value)
		{
			base.SetDataGridInColumn(Value);
			if(Combo.Parent!=Value)
			{
				if(Combo.Parent!=null)
				{
					Combo.Parent.Controls.Remove(Combo);
				}
			}
			if(Value!=null) 
			{
				Value.Controls.Add(Combo);
			}
		}
		protected override void UpdateUI(CurrencyManager Source,int RowNum, string InstantText)
		{
			Combo.Text = GetText(GetColumnValueAtRow(Source, RowNum));
			if(InstantText!=null)
			{
				Combo.Text = InstantText;
			}
		}															 
		
		private int DataGridTableGridLineWidth
		{
			get
			{
				if(this.DataGridTableStyle.GridLineStyle == DataGridLineStyle.Solid) 
				{ 
					return 1;
				}
				else
				{
					return 0;
				}
			}
		}
		public void EndEdit()
		{
			InEdit = false;
			Invalidate();
		}
		private string GetText(object Value)
		{
			if(Value==System.DBNull.Value)
			{
				return NullText;
			}
			if(Value!=null)
			{
				return Value.ToString();
			}
			else
			{
				return string.Empty;
			}
		}
		private void HideComboBox()
		{
			if(Combo.Focused)
			{
				this.DataGridTableStyle.DataGrid.Focus();
			}
			Combo.Visible = false;
		}
		private void RollBack()
		{
			Combo.Text = OldVal;
			//编辑结束
		}
		private void PaintText(Graphics g ,Rectangle Bounds,string Text,bool AlignToRight)
		{
			Brush BackBrush = new SolidBrush(this.DataGridTableStyle.BackColor);
			Brush ForeBrush= new SolidBrush(this.DataGridTableStyle.ForeColor);
			PaintText(g, Bounds, Text, BackBrush, ForeBrush, AlignToRight);
		}
		private void PaintText(Graphics g , Rectangle TextBounds, string Text, Brush BackBrush,Brush ForeBrush,bool AlignToRight)
		{	
			Rectangle Rect = TextBounds;
			RectangleF RectF  = Rect; 
			StringFormat Format = new StringFormat();
			if(AlignToRight)
			{
				Format.FormatFlags = StringFormatFlags.DirectionRightToLeft;
			}
			switch(this.Alignment)
			{
				case HorizontalAlignment.Left:
					Format.Alignment = StringAlignment.Near;
					break;
				case HorizontalAlignment.Right:
					Format.Alignment = StringAlignment.Far;
					break;
				case HorizontalAlignment.Center:
					Format.Alignment = StringAlignment.Center;
					break;
			}
			Format.FormatFlags =Format.FormatFlags;
			Format.FormatFlags =StringFormatFlags.NoWrap;
			g.FillRectangle(BackBrush, Rect);
			Rect.Offset(0, yMargin);
			Rect.Height -= yMargin;
			g.DrawString(Text, this.DataGridTableStyle.DataGrid.Font, ForeBrush, RectF, Format);
			Format.Dispose();
		}
	}
}

⌨️ 快捷键说明

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