DataGridComboBox.cs
上传用户:chizxy
上传日期:2014-11-29
资源大小:407k
文件大小: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 MKIms3
  7. {
  8. public class DataGridComboBox:ComboBox
  9. {
  10. public DataGridComboBox()
  11. {
  12. }
  13. public DataGridComboBox(DataTable DataSource, string DisplayMember , string ValueMember)
  14. {
  15. }
  16. public bool isInEditOrNavigateMode = true;
  17. }
  18. public class DataGridComboBoxColumn:DataGridColumnStyle
  19. {
  20. private int xMargin = 2;
  21. private int yMargin = 1;
  22. private DataGridComboBox Combo;
  23. private string _DisplayMember;
  24. private string _ValueMember;
  25. private string OldVal=new string(string.Empty.ToCharArray());
  26. private bool InEdit= false;
  27. public DataGridComboBoxColumn(DataTable DataSource, int DisplayMember,int ValueMember)
  28. {
  29. Combo = new DataGridComboBox();
  30. _DisplayMember = DataSource.Columns[DisplayMember].ToString();
  31. _ValueMember = DataSource.Columns[ValueMember].ToString();
  32. Combo.Visible=false;
  33. Combo.DataSource = DataSource;
  34. Combo.DisplayMember = _DisplayMember;
  35. Combo.ValueMember = _ValueMember;
  36. Combo.DropDownStyle = ComboBoxStyle.DropDownList;
  37. }
  38. public DataGridComboBoxColumn(DataTable DataSource,string DisplayMember,string ValueMember)
  39. {
  40. Combo = new DataGridComboBox();
  41. Combo.Visible = false;
  42. Combo.DataSource = DataSource;
  43. Combo.DisplayMember = DisplayMember;
  44. Combo.ValueMember = ValueMember;
  45. Combo.DropDownStyle = ComboBoxStyle.DropDownList;
  46. }
  47. protected override void Abort(int RowNum)
  48. {
  49. System.Diagnostics.Debug.WriteLine("Abort()");
  50. RollBack();
  51. HideComboBox();
  52. EndEdit();
  53. }
  54. protected override bool Commit(CurrencyManager DataSource,int RowNum)
  55. {
  56. HideComboBox();
  57. if(!InEdit)
  58. {
  59. return true;
  60. }
  61. try
  62. {
  63. object Value = Combo.SelectedValue;
  64. if(NullText.Equals(Value))
  65. {
  66. Value = System.Convert.DBNull; 
  67. }
  68. SetColumnValueAtRow(DataSource, RowNum, Value);
  69. }
  70. catch
  71. {
  72. RollBack();
  73. return false;
  74. }
  75. this.EndEdit();
  76. return true;
  77. }
  78. protected override void ConcedeFocus()
  79. {
  80. Combo.Visible=false;
  81. }
  82. protected override void Edit(CurrencyManager Source ,int Rownum,Rectangle Bounds, bool ReadOnly,string InstantText, bool CellIsVisible)
  83. {
  84. Combo.Text = string.Empty;
  85. Rectangle OriginalBounds = Bounds;
  86. OldVal = Combo.Text;
  87. if(CellIsVisible)
  88. {
  89. Bounds.Offset(xMargin, yMargin);
  90. Bounds.Width -= xMargin * 2;
  91. Bounds.Height -= yMargin;
  92. Combo.Bounds = Bounds;
  93. Combo.Visible = true;
  94. }
  95. else
  96. {
  97. Combo.Bounds = OriginalBounds;
  98. Combo.Visible = false;
  99. }
  100. Combo.SelectedValue = GetText(GetColumnValueAtRow(Source, Rownum));
  101. if(InstantText!=null)
  102. {
  103. Combo.SelectedValue = InstantText;
  104. }
  105. Combo.RightToLeft = this.DataGridTableStyle.DataGrid.RightToLeft;
  106. if(InstantText==null)
  107. {
  108. Combo.SelectAll();
  109. }
  110. else
  111. {
  112. int End = Combo.Text.Length;
  113. Combo.Select(End, 0);
  114. }
  115. if(Combo.Visible)
  116. {
  117. DataGridTableStyle.DataGrid.Invalidate(OriginalBounds);
  118. }
  119. InEdit = true;
  120. }
  121. protected override int GetMinimumHeight()
  122. {
  123. return Combo.PreferredHeight + yMargin;
  124. }
  125. protected override int GetPreferredHeight(Graphics g ,object Value)
  126. {
  127. System.Diagnostics.Debug.WriteLine("GetPreferredHeight()");
  128. int NewLineIndex  = 0;
  129. int NewLines = 0;
  130. string ValueString = this.GetText(Value);
  131. do
  132. {
  133. NewLineIndex = ValueString.IndexOf("rn", NewLineIndex + 1);
  134. NewLines += 1;
  135. }while(NewLineIndex != -1);
  136. return FontHeight * NewLines + yMargin;
  137. }
  138. protected override Size GetPreferredSize(Graphics g, object Value)
  139. {
  140. Size Extents = Size.Ceiling(g.MeasureString(GetText(Value), this.DataGridTableStyle.DataGrid.Font));
  141. Extents.Width += xMargin * 2 + DataGridTableGridLineWidth ;
  142. Extents.Height += yMargin;
  143. return Extents;
  144. }
  145. protected override void Paint(Graphics g,Rectangle Bounds,CurrencyManager Source,int RowNum)
  146. {
  147. Paint(g, Bounds, Source, RowNum, false);
  148. }
  149. protected override void Paint(Graphics g,Rectangle Bounds,CurrencyManager Source,int RowNum,bool AlignToRight)
  150. {
  151. string Text = GetText(GetColumnValueAtRow(Source, RowNum));
  152. PaintText(g, Bounds, Text, AlignToRight);
  153. }
  154. protected override void Paint(Graphics g,Rectangle Bounds,CurrencyManager Source,int RowNum,Brush BackBrush ,Brush ForeBrush ,bool AlignToRight)
  155. {
  156. string Text = GetText(GetColumnValueAtRow(Source, RowNum));
  157. PaintText(g, Bounds, Text, BackBrush, ForeBrush, AlignToRight);
  158. }
  159. protected override void SetDataGridInColumn(DataGrid Value)
  160. {
  161. base.SetDataGridInColumn(Value);
  162. if(Combo.Parent!=Value)
  163. {
  164. if(Combo.Parent!=null)
  165. {
  166. Combo.Parent.Controls.Remove(Combo);
  167. }
  168. }
  169. if(Value!=null) 
  170. {
  171. Value.Controls.Add(Combo);
  172. }
  173. }
  174. protected override void UpdateUI(CurrencyManager Source,int RowNum, string InstantText)
  175. {
  176. Combo.Text = GetText(GetColumnValueAtRow(Source, RowNum));
  177. if(InstantText!=null)
  178. {
  179. Combo.Text = InstantText;
  180. }
  181. }  
  182. private int DataGridTableGridLineWidth
  183. {
  184. get
  185. {
  186. if(this.DataGridTableStyle.GridLineStyle == DataGridLineStyle.Solid) 
  187. return 1;
  188. }
  189. else
  190. {
  191. return 0;
  192. }
  193. }
  194. }
  195. public void EndEdit()
  196. {
  197. InEdit = false;
  198. Invalidate();
  199. }
  200. private string GetText(object Value)
  201. {
  202. if(Value==System.DBNull.Value)
  203. {
  204. return NullText;
  205. }
  206. if(Value!=null)
  207. {
  208. return Value.ToString();
  209. }
  210. else
  211. {
  212. return string.Empty;
  213. }
  214. }
  215. private void HideComboBox()
  216. {
  217. if(Combo.Focused)
  218. {
  219. this.DataGridTableStyle.DataGrid.Focus();
  220. }
  221. Combo.Visible = false;
  222. }
  223. private void RollBack()
  224. {
  225. Combo.Text = OldVal;
  226. }
  227. private void PaintText(Graphics g ,Rectangle Bounds,string Text,bool AlignToRight)
  228. {
  229. Brush BackBrush = new SolidBrush(this.DataGridTableStyle.BackColor);
  230. Brush ForeBrush= new SolidBrush(this.DataGridTableStyle.ForeColor);
  231. PaintText(g, Bounds, Text, BackBrush, ForeBrush, AlignToRight);
  232. }
  233. private void PaintText(Graphics g , Rectangle TextBounds, string Text, Brush BackBrush,Brush ForeBrush,bool AlignToRight)
  234. {
  235. Rectangle Rect = TextBounds;
  236. RectangleF RectF  = Rect; 
  237. StringFormat Format = new StringFormat();
  238. if(AlignToRight)
  239. {
  240. Format.FormatFlags = StringFormatFlags.DirectionRightToLeft;
  241. }
  242. switch(this.Alignment)
  243. {
  244. case HorizontalAlignment.Left:
  245. Format.Alignment = StringAlignment.Near;
  246. break;
  247. case HorizontalAlignment.Right:
  248. Format.Alignment = StringAlignment.Far;
  249. break;
  250. case HorizontalAlignment.Center:
  251. Format.Alignment = StringAlignment.Center;
  252. break;
  253. }
  254. Format.FormatFlags =Format.FormatFlags;
  255. Format.FormatFlags =StringFormatFlags.NoWrap;
  256. g.FillRectangle(BackBrush, Rect);
  257. Rect.Offset(0, yMargin);
  258. Rect.Height -= yMargin;
  259. g.DrawString(Text, this.DataGridTableStyle.DataGrid.Font, ForeBrush, RectF, Format);
  260. Format.Dispose();
  261. }
  262. }
  263. }