Winform DataGridView列的單元格中動態添加圖片和文字


先上圖在說,第二列中圖片和文字的樣式

1、需要重寫DataGridViewTextBoxColumn,新建類TextAndImageColumn.cs

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Windows.Forms;
  6 using System.Drawing;
  7 
  8 namespace DataGridViewTest
  9 {
 10     public class TextAndImageColumn : DataGridViewTextBoxColumn
 11     {
 12         private Image imageValue;
 13         private Size imageSize;
 14 
 15         public TextAndImageColumn()
 16         {
 17             this.CellTemplate = new TextAndImageCell();
 18         }
 19 
 20         public override object Clone()
 21         {
 22             TextAndImageColumn c = base.Clone() as TextAndImageColumn;
 23             c.imageValue = this.imageValue;
 24             c.imageSize = this.imageSize;
 25             return c;
 26         }
 27 
 28         public Image Image
 29         {
 30             get { return this.imageValue; }
 31             set
 32             {
 33                 if (this.Image != value)
 34                 {
 35                     this.imageValue = value;
 36                     this.imageSize = value.Size;
 37 
 38                     if (this.InheritedStyle != null)
 39                     {
 40                         Padding inheritedPadding = this.InheritedStyle.Padding;
 41                         this.DefaultCellStyle.Padding = new Padding(imageSize.Width,
 42                     inheritedPadding.Top, inheritedPadding.Right,
 43                     inheritedPadding.Bottom);
 44                     }
 45                 }
 46             }
 47         }
 48         private TextAndImageCell TextAndImageCellTemplate
 49         {
 50             get { return this.CellTemplate as TextAndImageCell; }
 51         }
 52         internal Size ImageSize
 53         {
 54             get { return imageSize; }
 55         }
 56     }
 57 
 58     public class TextAndImageCell : DataGridViewTextBoxCell
 59     {
 60         private Image imageValue;
 61         private Size imageSize;
 62 
 63         public override object Clone()
 64         {
 65             TextAndImageCell c = base.Clone() as TextAndImageCell;
 66             c.imageValue = this.imageValue;
 67             c.imageSize = this.imageSize;
 68             return c;
 69         }
 70 
 71         public Image Image
 72         {
 73             get
 74             {
 75                 if (this.OwningColumn == null ||
 76            this.OwningTextAndImageColumn == null)
 77                 {
 78 
 79                     return imageValue;
 80                 }
 81                 else if (this.imageValue != null)
 82                 {
 83                     return this.imageValue;
 84                 }
 85                 else
 86                 {
 87                     return this.OwningTextAndImageColumn.Image;
 88                 }
 89             }
 90             set
 91             {
 92                 if (this.imageValue != value)
 93                 {
 94                     this.imageValue = value;
 95                     this.imageSize = value.Size;
 96 
 97                     Padding inheritedPadding = this.InheritedStyle.Padding;
 98                     this.Style.Padding = new Padding(imageSize.Width,
 99                    inheritedPadding.Top, inheritedPadding.Right,
100                    inheritedPadding.Bottom);
101                 }
102             }
103         }
104         protected override void Paint(Graphics graphics, Rectangle clipBounds,
105        Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState,
106        object value, object formattedValue, string errorText,
107        DataGridViewCellStyle cellStyle,
108        DataGridViewAdvancedBorderStyle advancedBorderStyle,
109        DataGridViewPaintParts paintParts)
110         {
111             // Paint the base content
112             base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState,
113               value, formattedValue, errorText, cellStyle,
114               advancedBorderStyle, paintParts);
115 
116             if (this.Image != null)
117             {
118                 // Draw the image clipped to the cell.
119                 System.Drawing.Drawing2D.GraphicsContainer container =
120                graphics.BeginContainer();
121 
122                 graphics.SetClip(cellBounds);
123                 graphics.DrawImageUnscaled(this.Image, cellBounds.Location);
124 
125                 graphics.EndContainer(container);
126             }
127         }
128 
129         private TextAndImageColumn OwningTextAndImageColumn
130         {
131             get { return this.OwningColumn as TextAndImageColumn; }
132         }
133     }
134 }

2、新建窗體Form1.cs,拖控件DataGridView到窗體,代碼如下

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Linq;
  7 using System.Text;
  8 using System.Windows.Forms;
  9 using System.Data.SqlClient;
 10 
 11 namespace DataGridViewTest
 12 {
 13     public partial class Form1 : Form
 14     {
 15         private static string imagePath = AppDomain.CurrentDomain.BaseDirectory.Substring(0, AppDomain.CurrentDomain.BaseDirectory.IndexOf("bin")) + "Images\\";//列表圖片路徑
 16         public Form1()
 17         {
 18             InitializeComponent();
 19             InitControlsProperties();
 20         }
 21 
 22         private void InitControlsProperties()
 23         {
 24             this.dataGridView1.AutoGenerateColumns = false;
 25             TextAndImageColumn ColumnRoleID = new TextAndImageColumn();
 26             ColumnRoleID.DataPropertyName = "RoleID";
 27             ColumnRoleID.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
 28             ColumnRoleID.Name = "RoleID";
 29             ColumnRoleID.HeaderText = "權限ID";
 30             ColumnRoleID.Width = 200;
 31             this.dataGridView1.Columns.Add(ColumnRoleID);
 32 
 33             this.dataGridView1.AutoGenerateColumns = false;
 34             TextAndImageColumn ColumnRoleName = new TextAndImageColumn();
 35             ColumnRoleName.DataPropertyName = "RoleName";
 36             ColumnRoleName.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
 37             ColumnRoleName.Name = "RoleName";
 38             ColumnRoleName.HeaderText = "權限名稱";
 39             ColumnRoleName.Width = 100;
 40             this.dataGridView1.Columns.Add(ColumnRoleName);
 41 
 42             this.dataGridView1.AutoGenerateColumns = false;
 43             TextAndImageColumn ColumnDescription = new TextAndImageColumn();
 44             ColumnDescription.DataPropertyName = "Description";
 45             ColumnDescription.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
 46             ColumnDescription.Name = "Description";
 47             ColumnDescription.HeaderText = "描述";
 48             ColumnDescription.Width = 150;
 49             this.dataGridView1.Columns.Add(ColumnDescription);
 50         }
 51 
 52         private void Form1_Load(object sender, EventArgs e)
 53         {
 54             string strConn = "Data Source=XIAN-PC;Initial Catalog=ReportServer;Persist Security Info=True;User ID=sa;Password=sa";
 55             SqlConnection conn = new SqlConnection(strConn);
 56             string strSql = "select * from Roles";
 57             SqlCommand cmd = new SqlCommand(strSql, conn);
 58             SqlDataAdapter adapter = new SqlDataAdapter(cmd);
 59             DataSet ds = new DataSet();
 60             conn.Open();
 61             adapter.Fill(ds, "Roles");
 62             conn.Close();
 63             this.dataGridView1.DataSource = ds.Tables["Roles"];
 64         }
 65 
 66         private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
 67         {
 68             #region 第二列
 69             if (e.ColumnIndex == 1)
 70             {
 71                 TextAndImageCell cell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex] as TextAndImageCell;
 72                 if (cell != null && e.Value != null)
 73                 {
 74                     try
 75                     {
 76                         string ajzt = cell.Value.ToString();
 77                         string path = imagePath;
 78                         switch (ajzt)
 79                         {
 80                             case "發布者":
 81                                 path += "1.png";
 82                                 break;
 83                             case "瀏覽者":
 84                                 path += "2.png";
 85                                 break;                            
 86                             default:
 87                                 path += "3.png";
 88                                 break;
 89                         }
 90                         cell.Image = GetImage(path);
 91                     }
 92                     catch (Exception ex)
 93                     {
 94 
 95                     }
 96                 }
 97             }
 98             #endregion
 99         }
100 
101         public System.Drawing.Image GetImage(string path)
102         {
103             return System.Drawing.Image.FromFile(path);
104         }
105 
106     }
107 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM