DataGridComboBoxColumn.cs
上传用户:hjieqiu
上传日期:2013-05-11
资源大小:16494k
文件大小:7k
源码类别:

企业管理

开发平台:

C#

  1. using System.Collections;
  2. using System.ComponentModel;
  3. using System.Drawing;
  4. using System.Windows.Forms;
  5. using System.Data;
  6. namespace 进销存管理系统
  7. {
  8. public class DataGridComboBox:ComboBox
  9. {
  10. // 继承下拉列表框类
  11. public DataGridComboBox()
  12. {
  13. }
  14. private void InitializeComponent()
  15. {
  16. }
  17. }
  18. public class DataGridComboBoxColumn:DataGridColumnStyle
  19. {
  20. //在dataGrid中创建一个下拉列表框,dataGrid中的这一列都拥有相同的下拉选项 
  21. private int xMargin = 2;
  22. private int yMargin = 1;
  23. private DataGridComboBox Combo;
  24. private string _DisplayMember;
  25. private string _ValueMember;
  26. //获取编辑状态
  27. private string OldVal=new string(string.Empty.ToCharArray());
  28. private bool InEdit= false;
  29. // 根据顺序号建立一个新的下拉列 
  30. public DataGridComboBoxColumn(DataTable DataSource, int DisplayMember,int ValueMember)
  31. {
  32. Combo = new DataGridComboBox();
  33. _DisplayMember = DataSource.Columns[DisplayMember].ToString();
  34. _ValueMember = DataSource.Columns[ValueMember].ToString();
  35. Combo.Visible=false;
  36. Combo.DataSource = DataSource;
  37. Combo.DisplayMember = _DisplayMember;
  38. Combo.ValueMember = _ValueMember;
  39. Combo.DropDownStyle = ComboBoxStyle.DropDown;
  40. }
  41. //根据字符串建立新的下拉列
  42. public DataGridComboBoxColumn(DataTable DataSource,string DisplayMember,string ValueMember)
  43. {
  44. Combo = new DataGridComboBox();
  45. Combo.Visible = false;
  46. Combo.DataSource = DataSource;
  47. Combo.DisplayMember = DisplayMember;
  48. Combo.ValueMember = ValueMember;
  49. Combo.DropDownStyle = ComboBoxStyle.DropDown;
  50. }
  51. // 重写DataGridColumnStyle中的方法
  52. // 重写Abort
  53. protected override void Abort(int RowNum)
  54. {
  55. System.Diagnostics.Debug.WriteLine("Abort()");
  56. RollBack();
  57. HideComboBox();
  58. EndEdit();
  59. }
  60. // 重写Commit
  61. protected override bool Commit(CurrencyManager DataSource,int RowNum)
  62. {
  63. HideComboBox();
  64. if(!InEdit)
  65. {
  66. return true;
  67. }
  68. try
  69. {
  70. //如果是: Combo.DropDownStyle = ComboBoxStyle.DropDownList;
  71. //object Value = Combo.SelectedValue;
  72. //如果是: Combo.DropDownStyle = ComboBoxStyle.DropDown;
  73. object Value = Combo.Text;
  74. if(NullText.Equals(Value))
  75. {
  76. Value = System.Convert.DBNull; 
  77. }
  78. SetColumnValueAtRow(DataSource, RowNum, Value);
  79. }
  80. catch
  81. {
  82. RollBack();
  83. return false;
  84. }
  85. this.EndEdit();
  86. return true;
  87. }
  88. //移出焦点
  89. protected override void ConcedeFocus()
  90. {
  91. Combo.Visible=false;
  92. }
  93. //重写编辑dataGrid的方法edit
  94. protected override void Edit(CurrencyManager Source ,int Rownum,Rectangle Bounds, bool ReadOnly,string InstantText, bool CellIsVisible)
  95. {
  96. Combo.Text = string.Empty;
  97. Rectangle OriginalBounds = Bounds;
  98. OldVal = Combo.Text;
  99. if(CellIsVisible)
  100. {
  101. Bounds.Offset(xMargin, yMargin);
  102. Bounds.Width -= xMargin * 2;
  103. Bounds.Height -= yMargin;
  104. Combo.Bounds = Bounds;
  105. Combo.Visible = true;
  106. }
  107. else
  108. {
  109. Combo.Bounds = OriginalBounds;
  110. Combo.Visible = false;
  111. }
  112. Combo.SelectedValue = GetText(GetColumnValueAtRow(Source, Rownum));
  113. if(InstantText!=null)
  114. {
  115. Combo.SelectedValue = InstantText;
  116. }
  117. Combo.RightToLeft = this.DataGridTableStyle.DataGrid.RightToLeft;
  118. if(InstantText==null)
  119. {
  120. Combo.SelectAll();
  121. }
  122. else
  123. {
  124. int End = Combo.Text.Length;
  125. Combo.Select(End, 0);
  126. }
  127. if(Combo.Visible)
  128. {
  129. DataGridTableStyle.DataGrid.Invalidate(OriginalBounds);
  130. }
  131. InEdit = true;
  132. }
  133. protected override int GetMinimumHeight()
  134. {
  135. // 设置combobox的最小高度
  136. return Combo.PreferredHeight + yMargin;
  137. }
  138. protected override int GetPreferredHeight(Graphics g ,object Value)
  139. {
  140. System.Diagnostics.Debug.WriteLine("GetPreferredHeight()");
  141. int NewLineIndex  = 0;
  142. int NewLines = 0;
  143. string ValueString = this.GetText(Value);
  144. do
  145. {
  146. NewLineIndex = ValueString.IndexOf("rn", NewLineIndex + 1);
  147. NewLines += 1;
  148. }while(NewLineIndex != -1);
  149. return FontHeight * NewLines + yMargin;
  150. }
  151. protected override Size GetPreferredSize(Graphics g, object Value)
  152. {
  153. Size Extents = Size.Ceiling(g.MeasureString(GetText(Value), this.DataGridTableStyle.DataGrid.Font));
  154. Extents.Width += xMargin * 2 + DataGridTableGridLineWidth ;
  155. Extents.Height += yMargin;
  156. return Extents;
  157. }
  158. protected override void Paint(Graphics g,Rectangle Bounds,CurrencyManager Source,int RowNum)
  159. {
  160. Paint(g, Bounds, Source, RowNum, false);
  161. }
  162. protected override void Paint(Graphics g,Rectangle Bounds,CurrencyManager Source,int RowNum,bool AlignToRight)
  163. {
  164. string Text = GetText(GetColumnValueAtRow(Source, RowNum));
  165. PaintText(g, Bounds, Text, AlignToRight);
  166. }
  167. protected override void Paint(Graphics g,Rectangle Bounds,CurrencyManager Source,int RowNum,Brush BackBrush ,Brush ForeBrush ,bool AlignToRight)
  168. {
  169. string Text = GetText(GetColumnValueAtRow(Source, RowNum));
  170. PaintText(g, Bounds, Text, BackBrush, ForeBrush, AlignToRight);
  171. }
  172. protected override void SetDataGridInColumn(DataGrid Value)
  173. {
  174. base.SetDataGridInColumn(Value);
  175. if(Combo.Parent!=Value)
  176. {
  177. if(Combo.Parent!=null)
  178. {
  179. Combo.Parent.Controls.Remove(Combo);
  180. }
  181. }
  182. if(Value!=null) 
  183. {
  184. Value.Controls.Add(Combo);
  185. }
  186. }
  187. protected override void UpdateUI(CurrencyManager Source,int RowNum, string InstantText)
  188. {
  189. Combo.Text = GetText(GetColumnValueAtRow(Source, RowNum));
  190. if(InstantText!=null)
  191. {
  192. Combo.Text = InstantText;
  193. }
  194. }  
  195. private int DataGridTableGridLineWidth
  196. {
  197. get
  198. {
  199. if(this.DataGridTableStyle.GridLineStyle == DataGridLineStyle.Solid) 
  200. return 1;
  201. }
  202. else
  203. {
  204. return 0;
  205. }
  206. }
  207. }
  208. public void EndEdit()
  209. {
  210. InEdit = false;
  211. Invalidate();
  212. }
  213. private string GetText(object Value)
  214. {
  215. if(Value==System.DBNull.Value)
  216. {
  217. return NullText;
  218. }
  219. if(Value!=null)
  220. {
  221. return Value.ToString();
  222. }
  223. else
  224. {
  225. return string.Empty;
  226. }
  227. }
  228. private void HideComboBox()
  229. {
  230. if(Combo.Focused)
  231. {
  232. this.DataGridTableStyle.DataGrid.Focus();
  233. }
  234. Combo.Visible = false;
  235. }
  236. private void RollBack()
  237. {
  238. Combo.Text = OldVal;
  239. //编辑结束
  240. }
  241. private void PaintText(Graphics g ,Rectangle Bounds,string Text,bool AlignToRight)
  242. {
  243. Brush BackBrush = new SolidBrush(this.DataGridTableStyle.BackColor);
  244. Brush ForeBrush= new SolidBrush(this.DataGridTableStyle.ForeColor);
  245. PaintText(g, Bounds, Text, BackBrush, ForeBrush, AlignToRight);
  246. }
  247. private void PaintText(Graphics g , Rectangle TextBounds, string Text, Brush BackBrush,Brush ForeBrush,bool AlignToRight)
  248. {
  249. Rectangle Rect = TextBounds;
  250. RectangleF RectF  = Rect; 
  251. StringFormat Format = new StringFormat();
  252. if(AlignToRight)
  253. {
  254. Format.FormatFlags = StringFormatFlags.DirectionRightToLeft;
  255. }
  256. switch(this.Alignment)
  257. {
  258. case HorizontalAlignment.Left:
  259. Format.Alignment = StringAlignment.Near;
  260. break;
  261. case HorizontalAlignment.Right:
  262. Format.Alignment = StringAlignment.Far;
  263. break;
  264. case HorizontalAlignment.Center:
  265. Format.Alignment = StringAlignment.Center;
  266. break;
  267. }
  268. Format.FormatFlags =Format.FormatFlags;
  269. Format.FormatFlags =StringFormatFlags.NoWrap;
  270. g.FillRectangle(BackBrush, Rect);
  271. Rect.Offset(0, yMargin);
  272. Rect.Height -= yMargin;
  273. g.DrawString(Text, this.DataGridTableStyle.DataGrid.Font, ForeBrush, RectF, Format);
  274. Format.Dispose();
  275. }
  276. }
  277. }