標籤:alt textbox error cte ted any ipc temp color
緣起
很久以前給datagridview繫結資料行的時候都是手動的,記得以前用Display自訂屬性來動態給datagridview繫結資料行。後來發現不行,於是還在博問發了問題:
後來熱心網友幫我回答了這個問題,一試還真可以。再次記錄一下。
測試流程:
1) View Entity:
/// <summary> /// IPC完工成品情況查詢實體 /// </summary> public class GdvSourceProductRpt { [DisplayName("客戶名稱")] public string custerName { get; set; } [DisplayName("成品訂單號")] public string orderNo { get; set; } [DisplayName("產品名稱")] public string InvName { get; set; } [DisplayName("制令")] public string mo_code { get; set; } [DisplayName("物料號")] public string goods_code { get; set; } [DisplayName("訂單量")] public int order_count { get; set; } [DisplayName("制令數")] public int mo_count { get; set; } [DisplayName("成品產量")] public int scanNum { get; set; } [ProgressBarCell(Style = 1)] [DisplayName("完成度")] public double rate { get; set; } }
2)DataGridView的DataSource設定為表單裡的 BindingSource,DataGridView自動完成中文列名的顯示
這個是手工操作按下不表
3)實現動態繫結資料行,實現多個資料來源在一個DataGridView裡顯示
/// <summary> /// 動態綁定DataGridView的列 /// </summary> /// <param name="t"></param> /// <param name="dgv"></param> protected virtual void BingGridColumn(Type t,DataGridView dgv) { dgv.Columns.Clear(); var props = t.GetProperties().Where(prop => prop.GetCustomAttributes(typeof(DisplayNameAttribute), false).Any()); int col_width = dgv.Width / props.Count() - 8; foreach (var prop in props) { DisplayNameAttribute attrib = (DisplayNameAttribute)prop.GetCustomAttributes(typeof(DisplayNameAttribute), false).FirstOrDefault(); if (prop.GetCustomAttributes(typeof(ProgressBarCellAttribute), false).Any()) { DataGridViewProgressBarColumn dc = new DataGridViewProgressBarColumn(); dc.Name = "col" + prop.Name; dc.HeaderText = attrib.DisplayName; dc.DataPropertyName = prop.Name; dc.Width = col_width; dgv.Columns.Add(dc); } else { DataGridViewTextBoxColumn dc = new DataGridViewTextBoxColumn(); dc.Name = "col" + prop.Name; dc.HeaderText = attrib.DisplayName; dc.DataPropertyName = prop.Name; dc.Width = col_width; dgv.Columns.Add(dc); } } } 使用:
效果:
順便貼一下代碼,如何?DataGridView進度條列。
public class DataGridViewProgressBarCell : DataGridViewCell { public DataGridViewProgressBarCell() { this.ValueType = typeof(decimal); } //設定進度條的背景色; public DataGridViewProgressBarCell(Color progressBarColor) : base() { ProgressBarColor = progressBarColor; } protected Color ProgressBarColor = Color.Green; //進度條的預設背景顏色,綠色; protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts) { using (SolidBrush backBrush = new SolidBrush(cellStyle.BackColor)) { graphics.FillRectangle(backBrush, cellBounds); } base.PaintBorder(graphics, clipBounds, cellBounds, cellStyle, advancedBorderStyle); using (SolidBrush brush = new SolidBrush(ProgressBarColor)) { if (value == null) value = 0; decimal num = System.Convert.ToDecimal(value); float percent = (float)(num / System.Convert.ToDecimal(100)); graphics.FillRectangle(brush, cellBounds.X, cellBounds.Y + 1, cellBounds.Width * percent, cellBounds.Height - 3); string text = string.Format("{0}%", num); SizeF rf = graphics.MeasureString(text, cellStyle.Font); float x = cellBounds.X + (cellBounds.Width - rf.Width) / 2f; float y = cellBounds.Y + (cellBounds.Height - rf.Height) / 2f; Color txtColor = Color.Lime; if (System.Convert.ToDecimal(value) < 10) txtColor = Color.OrangeRed; if (System.Convert.ToDecimal(value) < 50 && System.Convert.ToDecimal(value) > 20) txtColor = Color.DarkBlue; graphics.DrawString(text, cellStyle.Font, new SolidBrush(txtColor), x, y); } } }
public class DataGridViewProgressBarColumn : DataGridViewColumn { public DataGridViewProgressBarColumn() : base(new DataGridViewProgressBarCell()) { CellTemplate = new DataGridViewProgressBarCell(); } }
分享Winform datagridview 動態產生中文HeaderText