Winfrom DateGridView 实现Button列禁用

Form窗体如下所示:

实现如下:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace DataGridView添加禁用Button列
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public List<User> GetAllUser()
        {
            List<User> UserList = new List<User>();

            User u = new User();
            u.UserID = Guid.NewGuid().ToString().Replace("-", "");
            u.UserName = "张三丰";
            u.UserType = 0;
            UserList.Add(u);

            User u1 = new User();
            u1.UserID = Guid.NewGuid().ToString().Replace("-", "");
            u1.UserName = "周芷若";
            u1.UserType = 1;
            UserList.Add(u1);

            User u2 = new User();
            u2.UserID = Guid.NewGuid().ToString().Replace("-", "");
            u2.UserName = "赵敏";
            u2.UserType = 1;
            UserList.Add(u2);

            User u3 = new User();
            u3.UserID = Guid.NewGuid().ToString().Replace("-", "");
            u3.UserName = "张无忌";
            u3.UserType = 0;
            UserList.Add(u3);

            return UserList;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.dgvUser.AutoGenerateColumns = false;

            List<User> UserList = GetAllUser();
            this.dgvUser.DataSource = UserList;

            string num = string.Empty;
            int count = this.dgvUser.Rows.Count;
            for (int i = 0; i < count; i++)
            {
                num = this.dgvUser.Rows[i].Cells["UserType"].FormattedValue.ToString();
                DataGridViewDisableButtonCell btnCell = (DataGridViewDisableButtonCell)
                      this.dgvUser.Rows[i].Cells["UserStatus"];
                if (num.Equals("0"))
                {
                    btnCell.Enabled = false;
                }
                else btnCell.Enabled = true;
            }
        }

        private void dgvUser_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex == -1) return;
            string colName = this.dgvUser.Columns[e.ColumnIndex].Name;
            if (colName.Equals("UserStatus")) //设置
            {
                DataGridViewDisableButtonCell btnCell = (DataGridViewDisableButtonCell)
                    this.dgvUser.CurrentRow.Cells["UserStatus"];
                if (!btnCell.Enabled) return;

                MessageBox.Show("Test");
            }
        }
    }

    public class DataGridViewDisableButtonColumn : DataGridViewButtonColumn
    {
        public DataGridViewDisableButtonColumn()
        {
            this.CellTemplate = new DataGridViewDisableButtonCell();
        }
    }

    public class DataGridViewDisableButtonCell : DataGridViewButtonCell
    {
        private bool enabledValue;
        public bool Enabled
        {
            get
            {
                return enabledValue;
            }
            set
            {
                enabledValue = value;
            }
        }

        public override object Clone()
        {
            DataGridViewDisableButtonCell cell =
                (DataGridViewDisableButtonCell)base.Clone();
            cell.Enabled = this.Enabled;
            return cell;
        }

        public DataGridViewDisableButtonCell()
        {
            this.enabledValue = true;
        }

        protected override void Paint(Graphics graphics,
            Rectangle clipBounds, Rectangle cellBounds, int rowIndex,
            DataGridViewElementStates elementState, object value,
            object formattedValue, string errorText,
            DataGridViewCellStyle cellStyle,
            DataGridViewAdvancedBorderStyle advancedBorderStyle,
            DataGridViewPaintParts paintParts)
        {
            if (rowIndex != -1)
            {
                if (!this.enabledValue)
                {
                    if ((paintParts & DataGridViewPaintParts.Background) ==
                        DataGridViewPaintParts.Background)
                    {
                        SolidBrush cellBackground = new SolidBrush(cellStyle.BackColor);
                        graphics.FillRectangle(cellBackground, cellBounds);
                        cellBackground.Dispose();
                    }

                    if ((paintParts & DataGridViewPaintParts.Border) ==
                        DataGridViewPaintParts.Border)
                    {
                        PaintBorder(graphics, clipBounds, cellBounds, cellStyle, advancedBorderStyle);
                    }
                    Rectangle buttonArea = cellBounds;
                    Rectangle buttonAdjustment =
                        this.BorderWidths(advancedBorderStyle);
                    buttonArea.X += buttonAdjustment.X;
                    buttonArea.Y += buttonAdjustment.Y;
                    buttonArea.Height -= buttonAdjustment.Height;
                    buttonArea.Width -= buttonAdjustment.Width;
                    ButtonRenderer.DrawButton(graphics, buttonArea,
                        System.Windows.Forms.VisualStyles.PushButtonState.Disabled);

                    if (this.FormattedValue is String)
                    {
                        TextRenderer.DrawText(graphics, (string)this.FormattedValue,
                            this.DataGridView.Font, buttonArea, SystemColors.GrayText);
                    }
                }
                else
                {
                    base.Paint(graphics, clipBounds, cellBounds, rowIndex,
                        elementState, value, formattedValue, errorText,
                        cellStyle, advancedBorderStyle, paintParts);
                }
            }
        }
    }
}

  

时间: 2024-10-05 07:02:41

Winfrom DateGridView 实现Button列禁用的相关文章

【Excle数据透视表】如何禁用数据透视表的总计行/列

如上图:有行合计也有列合计.现在我们需要将行列合计都去除,如何操作呢? 解决办法一: 数据透视表区域任意单元格→数据透视表工具→设计→布局→总计→对行和列禁用 解决办法二: 数据透视表区域任意单元格→右键→数据透视表选项→汇总和筛选→取消选中显示行(列)合计 解决方案三: 右键单击数据透视表总计列→弹出快捷菜单→删除总计 列同样如此 操作后效果

jQuery Mobile修改button的内容

jQuery Mobile修改button的内容. 使用jQuery Mobile也有一段时间了,最近同事提出,他需要更改button的内容,但是修改不了.我也试着修改了几次,button的内容其实是更改了,但是页面并未刷新.在调试中使用了console.log()方法打印各种日志,再结合api文档,发现button方法可以进行刷新. 打印信息: 更新内容: $('#btn').val("如有疑问,请加QQ群:135430763共同学习!").button("refresh&

.NET组件控件实例编程系列——5.DataGridView数值列和日期列

在使用DataGridView编辑数据的时候,编辑的单元格一般会显示为文本框,逻辑值和图片会自动显示对应类型的列.当然我们自己可以手工选择列的类型,例如ComboBox列.Button列.Link列.在编辑数值和日期类型的时候,如果使用独立控件,我们会选择NumericUpDown和DataTimePicker,但在DataGridView中编辑的时候就只能用文本列.相比使用独立控件,文本框列缺少数值有效性检测,数值区间限制等功能.从本质上来看,.NET本身提供的DataGridViewChec

JavaFX的同一个HBox下拖动下拉条左側button乱跳动的问题?

 大神们,我如今有个这种button列.如图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTUxMTQyOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" > 然后多条数据的话右边会有个下拉条.如图: 可是如今就是拉动右边的下拉条.左边的button就会乱跳动乱掉.如图: 然后排查了下原因是由于每拉动一次下拉条的时候会调用一

ExtJS4.2学习(21)动态菜单与表格数据展示操作总结篇2

运行效果: 此文介绍了根据操作左侧菜单在右面板展示相应内容. 一.主页 先看一下跳转主页的方式:由在webapp根目录下的index.jsp跳转至demo的index.jsp 下面是demo的index.jsp的代码 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% response.setHeade

全局CSS样式

bootstrap全局css样式:一共12个内容模块 概览 栅格系统 排版 代码 表格 表单 按钮 图片 辅助类 响应式工具 使用Less 使用Sass 一.概览类 1.html5文档类型 <!DOCTYPE html> 2.移动设备优先 <meta name="viewport" content="width=device-width, initial-scale=1"> 3.排版与链接 bootstrap排版.链接样式设置了基本的全局样式

我的BootStrap学习笔记

1.全局样式里面: 1.container:版心 2.col-xx-xx:栅格布局 3.btn btn-default: 按钮,默认按钮样式 4..pull-left  pull-right  clearfix: 左浮动 右浮动 清除浮动 5.响应式工具:visiable-xx:  在xx下隐藏 6.text-center;text-left;text-right:居中/靠左/靠右 2.CSS组件里面: 1.Glyphicons 字体图标(自定义字体图标) 2.nav-tabs:导航 3.nav

2015年11月27日 BootStrap知识点汇总

一.BootStrap简介 BootStrap不支持IE的兼容模式,加入 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 平时使用的移动浏览器是放在虚拟视口viewport中,虚拟视口比屏幕宽,会破坏没有针对移动浏览器的布局,viewport可以让开发者控制网页的大小和缩放,width=device-width让宽度等于设备的宽度,初始缩放比例为1也就是不缩放,网页会显得更细腻,为了更好地适配移

c#dataGridView 知识

一.单元格内容的操作 // 取得当前单元格内容 Console.WriteLine(DataGridView1.CurrentCell.Value); // 取得当前单元格的列 Index Console.WriteLine(DataGridView1.CurrentCell.ColumnIndex); // 取得当前单元格的行 Index Console.WriteLine(DataGridView1.CurrentCell.RowIndex); 另外,使用 DataGridView.Curr