DataGridComboBoxColumn.cs
上传用户:ksd66jhda
上传日期:2013-04-03
资源大小:234k
文件大小:7k
- 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("rn", 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();
- }
- }
- }