如何将复选框作为 dataGridView 的 ColumnHeader

2023-11-27

我正在 C# VS2005 中开发一个窗口应用程序。我有一个 dataGridView,其中第一列有复选框。现在我希望列标题也成为一个复选框,如果我选择列中的所有复选框,则应选择该复选框。 我怎样才能做到这一点。? 我提到了代码项目链接

但如果我使用它,如果我点击FirstCell(不是标题)以下所有单元格都被选中。但我想在列标题中有一个复选框。我怎样才能做到这一点。?


我还需要有一个CheckBox在 a 的列标题中DataGridView柱子。我是这样做的:

  • 创建一个继承自的类DataGridViewColumnHeaderCell
  • 内部使用一个System.Windows.Forms.CheckBox存储检查状态并提供操作系统风格的视觉效果CheckBox表示。
  • Use a Bitmap作为缓冲区并绘制常规CheckBox在其上(使用CheckBox.DrawToBitmap)
  • 覆盖DataGridViewColumnHeaderCell.Paint并且,如有必要,在将缓冲区绘制到之前更新缓冲区Graphics受供于Paint
  • 在派生上提供 Checked 属性DataGridViewColumnHeaderCell,还有一个 CheckedChanged 事件
  • 代入导出的DataGridViewColumnHeaderCell在专栏的HeaderCell当。。。的时候DataGridView正在填充。
  • 勾选和取消勾选CheckBox当单击列标题时,仅当鼠标单击在范围内时CheckBox
  • 通过监听派生类外部实现全选/取消全选CheckedChanged事件,更新底层数据对象,然后调用ResetBindings更新DataGridView

这是我写的类,它派生自DataGridViewColumnHeaderCell:

class DataGridViewCheckBoxColumnHeaderCell : DataGridViewColumnHeaderCell
{
    private Bitmap buffer;
    private CheckBox checkBox;
    private Rectangle checkBoxBounds;

    public DataGridViewCheckBoxColumnHeaderCell()
    {
        this.checkBox = new CheckBox();
    }

    public event EventHandler CheckedChanged;

    public bool Checked
    {
        get 
        { 
            return this.checkBox.Checked; 
        }

        set
        {
            if (!this.Checked == value)
            {
                this.checkBox.Checked = value;
                if (this.buffer != null)
                {
                    this.buffer.Dispose();
                    this.buffer = null;
                }

                this.OnCheckedChanged(EventArgs.Empty);

                if (this.DataGridView != null)
                {
                    this.DataGridView.Refresh();
                }
            }
        }
    }

    protected override void Paint(
        Graphics graphics, 
        Rectangle clipBounds, 
        Rectangle cellBounds, 
        int rowIndex, 
        DataGridViewElementStates dataGridViewElementState, 
        object value, 
        object formattedValue, 
        string errorText, 
        DataGridViewCellStyle cellStyle, 
        DataGridViewAdvancedBorderStyle advancedBorderStyle, 
        DataGridViewPaintParts paintParts)
    {
        // Passing String.Empty in place of 
        // value and formattedValue prevents 
        // this header cell from having text.

        base.Paint(
            graphics, 
            clipBounds, 
            cellBounds, 
            rowIndex, 
            dataGridViewElementState, 
            String.Empty, 
            String.Empty, 
            errorText, 
            cellStyle, 
            advancedBorderStyle, 
            paintParts);

        if (this.buffer == null 
            || cellBounds.Width != this.buffer.Width
            || cellBounds.Height != this.buffer.Height)
        {
            this.UpdateBuffer(cellBounds.Size);
        }

        graphics.DrawImage(this.buffer, cellBounds.Location);
    }

    protected override Size GetPreferredSize(
        Graphics graphics, 
        DataGridViewCellStyle cellStyle, 
        int rowIndex, 
        Size constraintSize)
    {
        return this.checkBox.GetPreferredSize(constraintSize);
    }

    protected override void OnMouseClick(DataGridViewCellMouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left 
            && this.checkBoxBounds.Contains(e.Location))
        {
            this.Checked = !this.Checked;
        }

        base.OnMouseClick(e);
    }

    private void UpdateBuffer(Size size)
    {
        Bitmap updatedBuffer = new Bitmap(size.Width, size.Height);

        this.checkBox.Size = size;

        if (this.checkBox.Size.Width > 0 && this.checkBox.Size.Height > 0)
        {
            Bitmap renderedCheckbox = new Bitmap(
                this.checkBox.Width, 
                this.checkBox.Height);

            this.checkBox.DrawToBitmap(
                renderedCheckbox, 
                new Rectangle(new Point(), this.checkBox.Size));

            MakeTransparent(renderedCheckbox, this.checkBox.BackColor);
            Bitmap croppedRenderedCheckbox = AutoCrop(
                renderedCheckbox, 
                Color.Transparent);

            // TODO implement alignment, right now it is always
            // MiddleCenter regardless of this.Style.Alignment

            this.checkBox.Location = new Point(
                (updatedBuffer.Width - croppedRenderedCheckbox.Width) / 2, 
                (updatedBuffer.Height - croppedRenderedCheckbox.Height) / 2);

            Graphics updatedBufferGraphics = Graphics.FromImage(updatedBuffer);
            updatedBufferGraphics.DrawImage(
                croppedRenderedCheckbox, 
                this.checkBox.Location);

            this.checkBoxBounds = new Rectangle(
                this.checkBox.Location, 
                croppedRenderedCheckbox.Size);

            renderedCheckbox.Dispose();
            croppedRenderedCheckbox.Dispose();
        }

        if (this.buffer != null)
        {
            this.buffer.Dispose();
        }

        this.buffer = updatedBuffer;
    }

    protected virtual void OnCheckedChanged(EventArgs e)
    {
        EventHandler handler = this.CheckedChanged;
        if (handler != null)
        {
            handler(this, e);
        }
    }

    // The methods below are helper methods for manipulating Bitmaps

    private static void MakeTransparent(Bitmap bitmap, Color transparencyMask)
    {
        int transparencyMaskArgb = transparencyMask.ToArgb();
        int transparentArgb = Color.Transparent.ToArgb();

        List deadColumns = new List();

        for (int x = 0; x = 0; x--)
        {
            if (deadColumns.Count == bitmap.Height)
            {
                break;
            }

            for (int y = bitmap.Height - 1; y >= 0; y--)
            {
                if (deadColumns.Contains(y))
                {
                    continue;
                }

                int pixel = bitmap.GetPixel(x, y).ToArgb();

                if (pixel == transparencyMaskArgb)
                {
                    bitmap.SetPixel(x, y, Color.Transparent);
                }
                else if (pixel != transparentArgb)
                {
                    deadColumns.Add(y);
                    break;
                }
            }
        }
    }

    public static Bitmap AutoCrop(Bitmap bitmap, Color backgroundColor)
    {
        Size croppedSize = bitmap.Size;
        Point cropOrigin = new Point();
        int backgroundColorToArgb = backgroundColor.ToArgb();

        for (int x = bitmap.Width - 1; x >= 0; x--)
        {
            bool allPixelsAreBackgroundColor = true;
            for (int y = bitmap.Height - 1; y >= 0; y--)
            {
                if (bitmap.GetPixel(x, y).ToArgb() != backgroundColorToArgb)
                {
                    allPixelsAreBackgroundColor = false;
                    break;
                }
            }

            if (allPixelsAreBackgroundColor)
            {
                croppedSize.Width--;
            }
            else
            {
                break;
            }
        }

        for (int y = bitmap.Height - 1; y >= 0; y--)
        {
            bool allPixelsAreBackgroundColor = true;
            for (int x = bitmap.Width - 1; x >= 0; x--)
            {
                if (bitmap.GetPixel(x, y).ToArgb() != backgroundColorToArgb)
                {
                    allPixelsAreBackgroundColor = false;
                    break;
                }
            }

            if (allPixelsAreBackgroundColor)
            {
                croppedSize.Height--;
            }
            else
            {
                break;
            }
        }

        for (int x = 0; x = 0 && xWhole = 0)
                {
                    bitmapSection.SetPixel(x, y, bitmap.GetPixel(xWhole, yWhole));
                }
                else
                {
                    bitmapSection.SetPixel(x, y, Color.Transparent);
                }
            }
        }

        return bitmapSection;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将复选框作为 dataGridView 的 ColumnHeader 的相关文章

  • 为什么纯虚拟析构函数的实现必须为空?它应该是内联的吗?

    我在其他线程中读到 当您实现纯虚拟析构函数 是的 它可以有一个实现 时 它必须是空的 并且应该 是内联的 应该是空的吗 如果是这样 为什么 应该内联吗 如果是这样 为什么 编辑 这就是纯虚拟析构函数的实现方式 class A virtual
  • Cocoa 常量名称中的“k”代表什么[重复]

    这个问题在这里已经有答案了 可能的重复 Apple 的 API 中的 k 前缀表示什么 https stackoverflow com questions 675816 what does the k prefix indicate in
  • 如何获取网络服务的状态

    如何使用 C 获取 Web 服务的状态 无论是成功完成 失败还是待处理 private void button1 Click object sender EventArgs e var url servicsURL try var myRe
  • 在 ASP.NET Core 中全局重用变量

    我必须强制这些变量在我想使用的每个变量上重用 这让我很困难 我需要创建一个类来定义这些变量并在整个程序中使用它们 我怎样才能做到这一点 string RootFolderName Uplaod string ProductPictureFo
  • 如何防止函数中的隐式转换?

    我正在编写一个实用程序类 其中包含 IsEquals 和 IsGreaterThanEquals 等接受 double 类型参数的方法 当我将浮点值发送到方法时 它们会隐式转换为双精度值并进行比较 我不希望这种事发生 当我发送 float
  • 带有成员 (operator[]) 函数的 invoke_result

    如何为成员函数正确调用invoke result 或者专门用于运算符成员函数 我试过std invoke result
  • 预期在模拟中调用一次,但使用 Moq 时调用次数为 0 次

    我收到错误 在mock上调用一次 但是0次 下面是我的代码结构 public class GenerateAddress IGenerateAddress public GenerateAddress IAddress createAdd
  • 更改 Json 中属性的键

    这些天我正在尝试制作一个 json 编辑器 与树视图一起使用 我确实更改了值函数 我也可以更改一些键 但我无法在对象中设置键 我可以设置值 SetValue ref JObject main JToken token JToken newV
  • ofstream::operator<<(streambuf) 是一种复制文件的缓慢方法

    我需要一种跨平台 无需外部库的复制文件的方式 在我的第一遍中 我想出了 省略错误处理 char buffer LEN ifstream src srcFile ios in ios binary ofstream dest destFile
  • 如何在运行时统一捕捉两个对象?

    这是 3D 模型 我想将另一个像这样的模型连接到顶部的银色连接器 并将另一个模型连接到右侧 所以请帮助我捕捉它 https i stack imgur com qoWwl png我想知道如何在运行时将两个 3D 对象对齐在一起 即 在 玩
  • 从 Windows 选择声音并播放它们

    我有一个 WinForms 应用程序 该应用程序有一个 首选项 部分 用户可以在其中选择显示警报时播放哪些声音 是否可以有一个组合框 用户可以从 Windows 存储的声音中进行选择 例如 紧急停止 紧急蜂鸣 等 这些可以在 控制面板 gt
  • 使用 C# 在 XML 文档中查找特定值的好方法是什么?

    我正在调用 Oracle 公开的 WebService 它接受 ItemID 的输入并向我返回相应的 Item Number 我想获取从响应中包含的 XML 返回的项目编号 XML 看起来像这样
  • 如何根据条件退出 PostSharp 方面的 OnEntry 方法中的方法

    我希望方面根据如下条件退出方法调用 AttributeUsage AttributeTargets Method public class IgnoreIfInactiveAttribute OnMethodBoundaryAspect p
  • COM Interop 挂起会冻结整个 COM 系统。如何取消COM调用

    我正在使用通过 COM Interop 包装器公开的第三方 dll 然而 其中一个 COM 调用经常冻结 至少不会返回 为了至少让我的代码更加健壮 我异步包装了调用 getDeviceInfoWaiter is a ManualResetE
  • 作为服务运行时,URLDownloadToFile() 将对象写入缓存中

    我有一个软件 可以将图像下载到工作目录中 然后对其进行处理以创建视频 之后 这些文件将被独立脚本删除 问题是它还将文件写入以下目录 该软件作为系统服务运行 C Windows SysWOW64 config systemprofile Ap
  • 如何在迭代时从地图中删除?

    迭代时如何从地图中删除 喜欢 std map
  • 如何在 C 中将 int 和数组保存在共享内存中?

    我正在尝试编写一个程序 让子进程在 Linux 上相互通信 这些进程都是从同一个程序创建的 因此它们共享代码 我需要它们能够访问两个整数变量以及一个整数数组 我不知道共享内存是如何工作的 我搜索过的每一个资源除了让我困惑之外什么也没做 任何
  • 对数据绑定组合框进行排序的最佳方法是什么?

    我对此做了一些研究 似乎对数据绑定组合框进行排序的唯一方法是对数据源本身进行排序 在本例中为数据集中的数据表 如果是这种情况 那么问题就变成对数据表进行排序的最佳方法是什么 组合框绑定在设计器中设置初始化使用 myCombo DataSou
  • TPL架构问题

    我目前正在开展一个项目 我们面临并行处理项目的挑战 到目前为止没什么大不了的 现在来说说问题 我们有一个 ID 列表 我们定期 每 2 秒 为每个 ID 调用一个 StoredProcedure 需要单独检查每个项目的 2 秒 因为它们是在
  • SQlite 查询 - 如何检索多列数据?

    我很难在网上找到一个关于使用 xcode 和 cocos2dx 从 SQlite DB 获取多个值的工作示例 这是我的sql查询 char sql query 100 sprintf sql query SELECT FROM SQList

随机推荐

  • 更改 FlowDirection 时复选框勾选镜像

    操作系统 微软Windows 8 1 开发应用程序 Microsoft Visual Studio 2013 WPF应用程序开发 我已经从 Windows 7 迁移到 Windows 8 1 现在我在 VS2012 中开发的旧应用程序有一种
  • 关于c中“非声明”的优化?

    在学习编译器优化时 我在中编写代码C under Linux with GCC版本gcc version 4 4 5 Ubuntu Linaro 4 4 4 14ubuntu5 1 要了解not a statement nop 用C语言 我
  • 用于在列表框中添加/删除项目的事件 c#.NET

    我有一个列表框控件item动态添加和手动删除 由于 删除项目 按钮 当项目数量发生变化时 我想更新用户界面的其他部分 即 您必须选择一些文件 的标题 和项目计数标题 如何添加事件处理程序或有效地添加事件处理程序以在项目数量更改时触发 例如一
  • 通过Web服务从服务器发送pdf文件到客户端

    由于我是网络服务新手 您能告诉我问题的答案吗 我的问题是 我想实现一个 Web 服务 当客户端调用此 Web 服务时 该服务将 pdf 文件发送到客户端 请有人帮我提供一段不错的代码或解释 现在有人可以解决我的错误吗 12 23 09 42
  • PreRenderView 在每次回发时增量调用

    我对执行的顺序和数量有疑问f event type preRenderView 在我在这里搜索的过程中 我像往常一样找到了 BalusC 的答案this and this与我的问题相关的帖子 仍然给我留下了两个问题 当我放一个f event
  • 黑莓模拟器无法连接到互联网

    我的 BB 模拟器无法连接到互联网 我使用代理 并在 HTTP HANDLER 标题下的 rimpublic property 中输入了以下内容 application handler http proxyEnabled true appl
  • GLSL-ES 2.0 中顶点属性是否可以是数组?

    在 GLSL ES 中可以有数组 例如 GLSL ES 规格给出了以下作为数组的统一变量的示例 uniform vec4 lightPosition 4 顶点属性是否可以是数组 换句话说 根据规范 以下内容合法吗 attribute vec
  • 如何在实体框架代码优先中删除表?

    我正在使用具有自动迁移功能的实体框架 因此 当我向上下文添加新模型时 我的数据库会更新并创建新表 我想做的恰恰相反 将表从数据库中完全删除 但是 从 Context 类中删除定义不起作用 public class CompanyContex
  • Xcode:使用核心图像与 alpha 进行合成

    我想创建一个 CoreImage 滤镜链 并能够通过将其单独效果与 alpha 或不透明度设置合成来控制链中每个滤镜的 强度 但我没有看到与 alpha 合成的方法或文档中的不透明度 我猜我可以跳出核心图像过滤器链并与核心图形上下文进行合成
  • 将 JavaScript 变量值传递给输入类型隐藏值

    我想将两个整数的乘积值分配给 html 文档中已有的隐藏字段 我正在考虑获取 javascript 变量的值 然后将其传递给隐藏的输入类型 我很难解释 但这就是它应该如何工作 脚本示例 上面计算了产品 我希望产品位于隐藏字段中
  • 如何使用 Spring-Kafka 通过 Confluence Schema 注册表读取 AVRO 消息?

    如何使用 Spring Kafka 通过 Confluence Schema 注册表读取 AVRO 消息 有样品吗 我在官方参考文档中找不到它 下面的代码可以读取 customer avro 主题的消息 这是我定义的值的 AVRO 模式 t
  • 迭代未注册的加载项 (.xla)

    我需要帮助 了解如何迭代当前打开的 Excel 加载项文件 xla 尚未使用 Excel 注册Tools gt Add ins菜单路径 更具体地说 我对未出现在加载项对话框中但具有的任何工作簿感兴趣ThisWorkbook IsAddin
  • 如何在没有 matlabs 数据库工具箱的情况下从 matlab 访问 postgresql 数据库?

    我已经尝试使用pgmex 不幸的是它不能与 libpq5 一起工作 matlab 立即崩溃 要在不使用数据库工具箱的情况下从 matlab 连接到 postgres 请执行类似以下操作 Add jar file to classpath e
  • 未使用的方法和属性对库或可执行文件的影响

    我正在尝试为 C NET 创建源代码生成器 生成永远不会被调用的属性或方法会导致我的代码运行速度变慢吗 为不使用的库插入 using 语句怎么样 我假设编译器足够聪明 不会构建未使用的 using 语句 但它无法了解属性和方法 因为它们co
  • 使用 Telethon 发送 Telegram 消息:某些实体参数有效,其他参数无效?

    我正在使用 Telethon 的发信息功能向各种聊天发送消息 有时 目的地是另一个用户 只是常规的一对一聊天 有时是一个组 有时是一个超级组 有时是一个频道 我是其中的管理员 如果我理解正确的话 语法应该是 client send mess
  • 为什么PHP不支持多线程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我到处都读到 PHP 不支
  • 如何使用Python有效地将解析后的XML文档存储在MySQL数据库中?

    以下是 XML 文件 book xml
  • TFS 2013:同一台机器上的多个构建控制器

    我希望我们可以在同一台机器上使用多个构建控制器 因为我们有许多团队项目集合 但它们不会同时使用 因此这里不存在真正的性能问题 并且我们的大多数构建服务器都不会长时间使用 我知道可以使用 TFS 2010 和 TFS 2012 来做到这一点
  • 提升asio超时[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 boost asio 中设置阻塞套接字的超时 我之前读过一些关于超时的条目 但我不明白 我想要一个定义的连接超时 连接代码如下所示 try boost asio ip tcp resolver
  • 如何将复选框作为 dataGridView 的 ColumnHeader

    我正在 C VS2005 中开发一个窗口应用程序 我有一个 dataGridView 其中第一列有复选框 现在我希望列标题也成为一个复选框 如果我选择列中的所有复选框 则应选择该复选框 我怎样才能做到这一点 我提到了代码项目链接 但如果我使