zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    python PyQt5
    传入一张图,生成它的油画版!(python实现)(转 )
    Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)(转)
    Python3.7实现自动刷博客访问量(只需要输入用户id)(转)
    Python3 多线程的两种实现方式
    图片生成字符
    SqlServer性能优化 通过压缩与计算列提高性能(十一)
    json与bson的区别
    浅析Redis 和MongoDB
    Solr DocValues详解
  • 原文地址:https://www.cnblogs.com/liangwenchao-912/p/5024172.html
Copyright © 2011-2022 走看看