首页 > 其他分享 >EnableHeaderCheckBox导致空指针

EnableHeaderCheckBox导致空指针

时间:2023-07-27 17:44:32浏览次数:38  
标签:Telerik 导致 EnableHeaderCheckBox checkColumn private radGridView1 UI new 指针

GridViewCheckBoxColumn以CheckBox的形式显示、编辑bool值,实现行选中效果。

如果需要在表头添加全选框,可以将EnableHeaderCheckBox设置为true:

private void AddCheckColumn()
{
    checkColumn = new GridViewCheckBoxColumn();
    checkColumn.Name = "Select";
    checkColumn.HeaderText = "All";
    checkColumn.EnableHeaderCheckBox = true;
    this.radGridView1.Columns.Insert(0, checkColumn);
    this.radGridView1.HeaderCellToggleStateChanged += RadGridView1_HeaderCellToggleStateChanged;
}

private void RadGridView1_HeaderCellToggleStateChanged(object sender, GridViewHeaderCellEventArgs e)
{
    MessageBox.Show($"状态:{e.State}");
}

通过监听RadGridView的HeaderCellToggleStateChanged事件监听表头的全选框状态。除了切换表头的全选框状态时会触发该事件,切换列的CheckBox时如果同时切换了表头的全选框状态,也会触发该事件。

问题:

使用过程中,发现GridView隐藏再显示会报空指针异常。

分析

报错发生在GridView设置只读属性的位置,异常调用堆栈如下:

at Telerik.WinControls.UI.GridCheckBoxHeaderCellElement.UpdateCheckboxReadOnly()
at Telerik.WinControls.UI.GridCheckBoxHeaderCellElement.MasterTemplate_PropertyChanged(Object sender, PropertyChangedEventArgs e)
at System.ComponentModel.PropertyChangedEventHandler.Invoke(Object sender, PropertyChangedEventArgs e)
at Telerik.WinControls.UI.GridViewTemplate.OnNotifyPropertyChanged(PropertyChangedEventArgs e)
at Telerik.WinControls.UI.MasterGridViewTemplate.OnNotifyPropertyChanged(PropertyChangedEventArgs e)
at Telerik.WinControls.UI.GridViewTemplate.SetProperty[T](String propertyName, T& propertyField, T value)
at Telerik.WinControls.UI.MasterGridViewTemplate.set_GridReadOnly(Boolean value)
at Telerik.WinControls.UI.RadGridView.set_ReadOnly(Boolean value)
at CheckBoxInHeader_csharp.RadForm1.<AddButton>b__8_2(Object o, EventArgs e) in \CheckBoxInHeader_csharp\RadForm1.cs:line 82

根据异常调用堆栈,发现是在Telerik内部报错,直接反编译调试下,在GridCheckBoxHeaderCellElement.UpdateCheckboxReadOnly()处设置断点,看看为什么导致空指针。查看this无法计算表达式,可以编辑下方法,加几个判断:

可以看到,this.ColumnInfo为空。继续调试,发现EnableHeaderCheckBox设置为true的列如果被隐藏,当设置GridView的Readonly属性的时候就会触发该异常,这是UI框架的BUG。

解决

可以自己实现GridCheckBoxHeaderCellElement,不用官方的,参考文档,这比较麻烦。简单处理,加个try-catch捕获下吧。以下是测试代码,先点击测试1,再点击测试2就会触发该异常。

public partial class RadForm1 : RadForm
    {
        private bool flag1 = false;
        private bool flag2 = false;
        private GridViewCheckBoxColumn checkColumn;

        public RadForm1()
        {
            InitializeComponent();
            AddCheckColumn();
            AddButton();

            this.radGridView1.RowCount = 10;
            this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
            this.radGridView1.MasterTemplate.AllowAddNewRow = false;
        }

        private void AddCheckColumn()
        {
            checkColumn = new GridViewCheckBoxColumn();
            checkColumn.Name = "Select";
            checkColumn.HeaderText = "All";
            checkColumn.EnableHeaderCheckBox = true;
            this.radGridView1.Columns.Insert(0, checkColumn);
            this.radGridView1.HeaderCellToggleStateChanged += RadGridView1_HeaderCellToggleStateChanged;

            this.radGridView1.Columns.Add(new GridViewTextBoxColumn("A"));
            this.radGridView1.Columns.Add(new GridViewTextBoxColumn("B"));
        }

        private void RadGridView1_HeaderCellToggleStateChanged(object sender, GridViewHeaderCellEventArgs e)
        {
            MessageBox.Show($"状态:{e.State}");
        }

        private void AddButton()
        {
            Button btn1 = new Button();
            btn1.Text = "测试1";
            btn1.Click += (o, e) =>
            {
                checkColumn.IsVisible = flag1;
                flag1 = !flag1;
            };
            btn1.Location = new Point(5, 5);
            this.Controls.Add(btn1);

            Button btn2 = new Button();
            btn2.Text = "测试2";
            btn2.Click += (o, e) =>
            {
                if (flag2)
                    radGridView1.Hide();
                else
                {
                    radGridView1.Show();
                    try
                    {
                        radGridView1.ReadOnly = flag2;
                    }
                    catch { }
                }
                flag2 = !flag2;
            };
            btn2.Location = new Point(120, 5);
            this.Controls.Add(btn2);
        }
    }

标签:Telerik,导致,EnableHeaderCheckBox,checkColumn,private,radGridView1,UI,new,指针
From: https://www.cnblogs.com/louzixl/p/17585628.html

相关文章

  • 为什么直流分量导致归一化频谱变小?
    直接举一个例子。假设有一个包含N个样本的信号,表示\(x[n]\),其中\(n=0,1,2,...,N-1\)。信号的DFT表示\(X[k]\),其中\(k=0,1,2,...,N-1\),对应信号在不同频率上的分量,DFT的计算公式如下:\[X[k]=\sum\nolimits_{n=0}^Nx[n]\cdote^{-j(2\pi/N)\cdotk\cdotn}......
  • 指针DAY3
    指针3指针和多维数组  代码:#include<stdio.h>intmain(){intC[3][2][2]={{{2,5},{7,9}},{{3,4},{6,1}},{{0,8},{11,13}}};printf("%d%d%d%d\n",C,*C,C[0],&C[0][0]);p......
  • 双指针/位运算/离散化/区间和并
    双指针两个指针指向两个不同的序列两个指针指向同一个序列(归并排序,快速排序)主要作用:将暴力O(n^2)遍历通过两个指针的某种单调性质优化到O(n),也就是说将内层循环变量j通过与外层循环变量i的关系,将内层循环次数降低不定次模板:for(inti=1;i<n;++i){ while(j<i&&......
  • 问题--链表指针传参,修改next指针只传值
    1.问题--链表指针传参,修改next指针只传值Link_creat_head(&head,p_new);//将新节点加入链表在这当中head头指针传的是地址,而p_new传的是值,这二者有什么区别?#include<stdio.h>#include<stdlib,h>//定义结点结构体typedefstructstudent{//数据域intnum;......
  • 服务器数据恢复-重建MDisk导致VDisk丢失的数据恢复案例
    服务器数据恢复环境:IBM某型号存储;Solaris操作系统,部署Oracle数据库。服务器故障:重建MDisk导致对应的存储池中的VDisk丢失,导致Solaris操作系统中的Oracle数据库无法使用。服务器数据恢复过程:1、将所有涉及到Oracle数据库的VDisk以只读模式连接到北亚企安备份服务器上,在只读模......
  • ansible一时脑抽使用file模块操作文件导致远程主机bin目录软连接被更改,系统无法登录
    如题,二者有相同的参数,脑抽执行后就悲剧了,造成多个主机无法远程登录。故障起因:错误操作:使用ansilbe远程往目标主机/bin目录拷贝文件的时候,使用错误模块,本该使用copy模块,而使用了file模块,造成远程主机/bin这个软连接被连接到了不存在的文件,并且权限被设置为了644。影响:造成远程主......
  • C++使用指针进行地址传递及错误示范
    正确示范:voidchange(int*a,int*b){ inttemp=*a; *a=*b; *b=temp;}错误示范:voidchange(int*a,int*b){ int*temp=a; a=b; b=temp;} ......
  • RabbitMQ由于x-message-ttl设置与代码不一致导致declareQueue时IO异常
    具体异常:Causedby:com.rabbitmq.client.ShutdownSignalException:channelerror;protocolmethod:#method<channel.close>(reply-code=406,reply-text=PRECONDITION_FAILED-inequivalentarg'x-message-ttl'forqueue'queryResult'invho......
  • cpp: 指针赋值
      char*pp=newchar[100]; chard[100]="geovindu,涂聚文"; stringddstr="geovindu,涂聚文"; char*dstr=nullptr; pp=d; dstr=&ddstr[0]; printf(dstr); printf(pp); printf("\n"); ......
  • 初识C数据结构之“*”和“&”(指针、解引用、取地址、引用)
    这天小阿杰又在看C数据结构——顺序表中几个传参的小小的内容引起了小阿杰大大的疑惑:(教材为严蔚敏老师的《数据结构(C语言版第2版)》)可怜的小阿杰当时只知道&取地址……后来查阅资料才对其中略知一二,那咱们下面就来唠唠。顺便提一下,引用&只在C++中有,C语言......