using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Data.Linq.Mapping; using System.Drawing; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace PTMedicalInsurance.Entity { /// /// 后面出入参基本集成该类,将一些通用方法封装于该类 /// 基线版的出入参需要包含Column属性,数据库字段名成,数据库字段类型(可以为入参给定类型)等 /// 需要包含StringLength 属性,标明在表格中显示的宽度,实际显示宽度值 = 长度 * 字体大概像素宽度,其中各种字体的不同SIZE对应的像素宽度是不同的,具体每个字符的像素宽度也是不同的,因此只能估计 /// 包含DisplayName属性,在表中的标题显示 /// 以上属性均进行为空判断 /// public class EntityBase { /// /// 动态增加datagridview列 /// /// /// /// protected void AddDGVColumn(DataGridView dgv, string headerText, string dataPropertyName, int width = 120,bool isAdapter = false) { DataGridViewColumn newColumn = new DataGridViewTextBoxColumn(); newColumn.HeaderText = headerText; newColumn.Width = width; newColumn.DataPropertyName = dataPropertyName; newColumn.Name = dataPropertyName; if (isAdapter) newColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells; dgv.Columns.Add(newColumn); } public void SetHeaderText(DataGridView dgv,Font font) { Type type = this.GetType(); var properties = type.GetProperties(); dgv.AutoGenerateColumns = false; dgv.Columns.Clear(); dgv.Font = font; foreach (var property in properties) { //获取显示名称 var display = property.GetCustomAttribute(); if (display == null) continue; string dispalyName = display.DisplayName; int disLen = CalculateVarCharLength(dispalyName); var strLength = property.GetCustomAttribute(); if (strLength == null) continue; int len = strLength.MaximumLength; int width = len>disLen ? (int)(len*6.5f) : (int)(disLen * 6.5f); bool isAdapter = width > 200; AddDGVColumn(dgv, dispalyName, property.Name, width,isAdapter); } dgv.CellValueChanged += DataGridView_CellValueChanged; } /// /// 计算字符串在 VarChar 类型中的长度(以字节为单位) /// /// 要计算长度的字符串 /// 字符串在 VarChar 类型中的长度 public static int CalculateVarCharLength(string input) { // 使用 UTF-16 编码计算字符串的字节数 Encoding utf16Encoding = Encoding.UTF8; byte[] bytes = utf16Encoding.GetBytes(input); return bytes.Length; } /// /// 将实体类转换为数据库入参(Json) /// public JObject ConvertToDBJson() { Type type = this.GetType(); var properties = type.GetProperties(); JObject joRtn = new JObject(); foreach (var property in properties) { var attribute = property.GetCustomAttribute(); if (attribute == null) continue; string fieldName = attribute.Name; // 使用 BindingFlags 来允许访问非公共属性 object value = property.GetValue(this, null); // 保持原始数据类型 JToken token = value == null ? JValue.CreateNull() : JToken.FromObject(value); joRtn.Add(fieldName, token); } return joRtn; } private static void DataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e) { // 只有在最后一列编辑完成时才会触发此事件 if (e.RowIndex == -1 && e.ColumnIndex == -1) { AdjustColumnWidths((DataGridView)sender); } } private static void AdjustColumnWidths(DataGridView dataGridView) { for (int i = 0; i < dataGridView.Columns.Count; i++) { DataGridViewColumn column = dataGridView.Columns[i]; // 获取列标题的宽度 float titleSize = CalculateVarCharLength(column.HeaderText); float maxWidth = titleSize; // 遍历每一行 foreach (DataGridViewRow row in dataGridView.Rows) { if (!row.IsNewRow && !string.IsNullOrEmpty(row.Cells[i].Value?.ToString())) { float cellSize = CalculateVarCharLength(row.Cells[i].Value.ToString()); maxWidth = Math.Max(maxWidth, cellSize); } } // 设置列宽 column.Width = (int)Math.Ceiling(maxWidth) + 5; // 加上一点额外空间 } } } }