首页 > 编程语言 >Sb9-关于使用别人封装的C#控件出现异常如何处理

Sb9-关于使用别人封装的C#控件出现异常如何处理

时间:2023-12-12 14:47:19浏览次数:37  
标签:控件 C# Sb9 System OnKeyDown Forms Windows base

偶然间我在网上看到一个封装了DataGridView控件的第三方控件,里面有很多是我需要的效果。所以就直接拿来使用了,但是今天突然发现,这个控件里面的“TreeGridView”表格控件在没有绑定数据的时候,如果点击回车键的话会抛出一个空指针的异常。

在 AdvancedDataGridView.TreeGridView.OnKeyDown(KeyEventArgs e)
在 System.Windows.Forms.Control.ProcessKeyEventArgs(Message& m)
在 System.Windows.Forms.DataGridView.ProcessKeyEventArgs(Message& m)
在 System.Windows.Forms.Control.ProcessKeyMessage(Message& m)
在 System.Windows.Forms.Control.WmKeyChar(Message& m)
在 System.Windows.Forms.Control.WndProc(Message& m)
在 System.Windows.Forms.DataGridView.WndProc(Message& m)
在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
在 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
在 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
在 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
在 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
在 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
在 System.Windows.Forms.Application.Run(Form mainForm)
在 ProductionToolPlatSystem.Program.RunMain() 在 D:\ZYJ\myCode\word\任务4-测试软件重新整合\ProductionPlatformV4.5-升级版本\ProductionPlatSystem\ProductionToolPlatSystem\Program.cs 中: 第 44 行
View Code

异常详细信息我贴在上面了。很奇怪的现象,不知道问题出在哪里,然后我就看了一下这个“ExpandableGridView.dll”的源码,我就发现这个动态库中我使用的TreeGridView中存在捕获键盘事件:

protected override void OnKeyDown(KeyEventArgs e)
    {
        base.OnKeyDown(e);
        if (e.Handled)
        {
            return;
        }
        if (e.KeyCode == Keys.F2 && base.CurrentCellAddress.X > -1 && base.CurrentCellAddress.Y > -1)
        {
            if (!base.CurrentCell.Displayed)
            {
                base.FirstDisplayedScrollingRowIndex = base.CurrentCellAddress.Y;
            }
            base.SelectionMode = DataGridViewSelectionMode.CellSelect;
            BeginEdit(selectAll: true);
        }
        else if (e.KeyCode == Keys.Return && !base.IsCurrentCellInEditMode)
        {
            base.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            base.CurrentCell.OwningRow.Selected = true;
        }
    }
View Code

但是调试状态没法进入他的代码体中,反正我可以断定是这个键盘事件中肯定存在某个对象是空的,本来想按照他的代码重新写一遍,这样就可以调试了,但是这个“ExpandableGridView.dll”类库中的代码太多了,懒得抄了,只能再封装一次吧。

我新建了一个UseControl控件,继承了所需要使用的TreeGridView控件,然后重写了他的OnKeyDown事件:

public partial class ExpandableGridViewControl : AdvancedDataGridView.TreeGridView
    {
        public ExpandableGridViewControl()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="e"></param>
        protected override void OnKeyDown(KeyEventArgs e)
        {
            base.OnKeyDown(e);
            if (e.Handled)
            {
                return;
            }
            if (e.KeyCode == Keys.F2 && base.CurrentCellAddress.X > -1 && base.CurrentCellAddress.Y > -1)
            {
                if (!base.CurrentCell.Displayed)
                {
                    base.FirstDisplayedScrollingRowIndex = base.CurrentCellAddress.Y;
                }
                base.SelectionMode = DataGridViewSelectionMode.CellSelect;
                BeginEdit(selectAll: true);
            }
            else if (e.KeyCode == Keys.Return && !base.IsCurrentCellInEditMode)
            {
                base.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
                base.CurrentCell.OwningRow.Selected = true;
            }
        }
}
View Code

此处我们重写的OnKeyDown事件代码和“ExpandableGridView.dll”类库中TreeGridView的OnKeyDown事件代码一模一样(实际就是想能够进入调试这个代码),但是我们必须先注释掉“base.OnKeyDown(e);”代码,不然直接进入了“ExpandableGridView.dll”类库中TreeGridView的OnKeyDown事件,就没法继续调试错误了。

问题找到了,原来是因为当按下回车的时候控件的CurrentCell是空值,所以直接抛出了异常。没办法了,毕竟代码用了很多次这个控件,直接重新封装一下,在捕获键盘事件后,首先判断一下CurrentCell是否为空,若是空的就不做任何处理了。

 

标签:控件,C#,Sb9,System,OnKeyDown,Forms,Windows,base
From: https://www.cnblogs.com/yjcore/p/17896757.html

相关文章

  • C++(using namespace std;)
    usingnamespacestd;是C++中的一条指令,用于指示编译器使用标准命名空间std中的所有标识符。这意味着在代码中可以直接使用标准库中的各种类、函数和对象,而无需在每个标识符前面添加std::前缀。以下是关于这条指令的一些解释:using关键字:using是一个关键字,用于创建别......
  • css自适应文本大小
    div{width:500px;height:600px;resize:both;//可拖动方向overflow:hidden;padding:15px;background-color:red;container-type:size;//对}divp{//cqw表示根据container-type所选择的宽度作为参照,3cqw表示为500*0.03,//cqh表示根据container......
  • MBR30200FCT-ASEMI大电流肖特基MBR30200FCT
    编辑:llMBR30200FCT-ASEMI大电流肖特基MBR30200FCT型号:MBR30200FCT品牌:ASEMI封装:TO-220F最大平均正向电流:30A最大重复峰值反向电压:200V产品引线数量:3产品内部芯片个数:2产品内部芯片尺寸:122MIL峰值正向漏电流:<10ua恢复时间:5ns浪涌电流:275A芯片材质:最大正向电压:0.85V~0......
  • 1.5万字 + 25张图盘点RocketMQ 11种消息类型,你知道几种?
    大家好,我是三友~~故事的开头是这样的最近有个兄弟私信了我一张截图我一看截图内容,好家伙,原来是我一年多前立的flag倒不是我忘了这件事,我后来也的确写了一篇的关于RocketMQ运行的原理的文章只不过这篇文章是从上帝的视角去看待RocektMQ一条消息整个生命周期的过程所以就没有......
  • C# 7.0的新特性
        ......
  • Oracle 表空间常用SQL
    --1、查看表空间的名称、大小、剩余空间SELECTt.tablespace_nameas表空间名,round(SUM(bytes/(1024*1024)),0)as大小_MFROMdba_tablespacestinnerjoindba_data_filesd on t.tablespace_name=d.tablespace_nameGROUPBYt.tablespace_name;--2、查看表空间物理......
  • Django 创建项目时找不到数据库sqlite3,提示no changes detected
    原因:PyCharm创建Django项目,找不到数据库sqlite3 解决:如果没有默认的db文件,则应在PyCharm终端中执行以下命令:pythonmanage.pymakemigrations:提示pythonmanage.pymigrate ......
  • 无涯教程-MFC - Date & Time Picker函数
    日期和时间选择控件(CDateTimeCtrl)实现了一种直观且可识别的输入或选择特定日期的方法,选择日期后,月份日历控件将自动消失。让无涯教程通过创建一个新的MFC应用程序来研究一个简单的示例。步骤1-删除标题并将其ID设置为IDC_STATIC_TXT。步骤2-为文本控件添加value变量。......
  • 开源机器学习版本的Github:Hugging Face
    参考:https://baijiahao.baidu.com/s?id=1776478347325976510https://zhuanlan.zhihu.com/p/535100411 ===============================   ......
  • Guardrails for Amazon Bedrock 基于具体使用案例与负责任 AI 政策实现定制式安全保障
    作为负责任的人工智能(AI)战略的一部分,您现在可以使用 GuardrailsforAmazonBedrock(预览版),实施专为您的用例和负责任的人工智能政策而定制的保障措施,以此促进用户与生成式人工智能应用程序之间的安全交互。亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术......