自定义DataGridView列值在失去焦点后消失

2024-05-13

我在 WinForms 中为我的项目创建了一个自定义 DataGridViewColumn。该控件呈现完美,但一旦我输入值并移动到另一个单元格,当我签入 CellEndEdit 时,该值就会消失并显示为 null。

以下是代码:

class NumericEditControl : NumericTextBox, IDataGridViewEditingControl
{
    DataGridView dataGridView;
    private bool valueChanged = false;
    int rowIndex;

    public NumericEditControl()
    {
        this.Value = 0;
    }

    public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
    {
        this.Font = dataGridViewCellStyle.Font;
        this.ForeColor = dataGridViewCellStyle.ForeColor;
        this.BackColor = dataGridViewCellStyle.BackColor;
    }

    public DataGridView EditingControlDataGridView
    {
        get
        {
            return dataGridView;
        }
        set
        {
            dataGridView = value;
        }
    }

    public object EditingControlFormattedValue
    {
        get
        {
            return this.Value;
        }
        set
        {
            this.Value = Convert.ToDouble(value);
        }
    }

    public int EditingControlRowIndex
    {
        get
        {
            return rowIndex;
        }
        set
        {
            rowIndex = value;
        }
    }

    public bool EditingControlValueChanged
    {
        get
        {
            return valueChanged;
        }
        set
        {
            valueChanged = value;
        }
    }

    public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
    {
        switch (keyData & Keys.KeyCode)
        {
            case Keys.Left:
            case Keys.Up:
            case Keys.Down:
            case Keys.Right:
            case Keys.Home:
            case Keys.End:
            case Keys.PageDown:
            case Keys.PageUp:
                return true;
            default:
                return !dataGridViewWantsInputKey;
        }
    }

    public Cursor EditingPanelCursor
    {
        get
        {
            return base.Cursor;
        }
    }

    public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
    {
        return EditingControlFormattedValue;
    }

    public void PrepareEditingControlForEdit(bool selectAll)
    {

    }

    public bool RepositionEditingControlOnValueChange
    {
        get { return false; }
    }

}

细胞类别如下:

public class NumericCell : DataGridViewTextBoxCell
{
    public NumericCell()
        : base()
    {
        this.Style.Format = "0";
    }

    public override void InitializeEditingControl(int rowIndex, object
    initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
    {
        // Set the value of the editing control to the current cell value.
        base.InitializeEditingControl(rowIndex, initialFormattedValue,
            dataGridViewCellStyle);
        NumericEditControl ctl =
            DataGridView.EditingControl as NumericEditControl;
        // Use the default row value when Value property is null.
        if (this.Value == null)
        {
            ctl.Value = 0;
        }
        else
        {
            ctl.Value = (double)this.Value;
        }
    }

    public override Type EditType
    {
        get
        {
            return typeof(NumericEditControl);
        }
    }

    public override Type ValueType
    {
        get
        {
            return typeof(double);
        }
    }

    public override object DefaultNewRowValue
    {
        get
        {
            return "0";
        }
    }


}

最后是 DataGridViewColumn

public class NumericDataColumn : DataGridViewColumn
{
    public NumericDataColumn()
        : base(new NumericCell())
    {
    }

    public override DataGridViewCell CellTemplate
    {
        get
        {
            return base.CellTemplate;
        }
        set
        {
            if (value != null &&
                !value.GetType().IsAssignableFrom(typeof(NumericCell)))
            {
                throw new InvalidCastException("Must be a Numeric");
            }
            base.CellTemplate = value;
        }
    }
}

在设计师中

private GridControl.NumericDataColumn colRoll;

它呈现了控件,但我无法理解为什么该值正在消失。你能帮我一下吗


事实证明,我们还必须处理控件的文本/值更改事件,直到并且除非单元格脏了,否则该值将不会保留。所以我必须将以下方法添加到我的 NumericEditControl 类中

class NumericEditControl : NumericTextBox, IDataGridViewEditingControl
{
    //Old code here
    protected override void OnTextChanged(EventArgs e)
    {
        if (dataGridView != null)
        {
            valueChanged = true;

            this.dataGridView.NotifyCurrentCellDirty(true);
            base.OnTextChanged(e);
        }
    }
}

添加此方法救了我的命,我的控件现在可以正常工作了:D 感谢您的输入。

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

自定义DataGridView列值在失去焦点后消失 的相关文章

随机推荐

  • 在 ARKit 和 RealityKit 中使用 Raycast 的真正好处是什么?

    RealityKit 和 ARKit 中的光线投射有何用途 我什么时候需要使用makeRaycast查询 https developer apple com documentation realitykit arview 3255315 m
  • strlen - 字符串的长度有时会增加 1

    我正在做一些 C 智力题 在大多数情况下 我能够找到正确的答案 但我遇到了问题 我通过使用编译器知道正确的答案 但我不知道原因 看一下代码 char c abc 012 0x34 什么会strlen c 返回 使用标准 C 编译器 我的编译
  • iOS 版 Sunrise 如何使用 iCloud 凭据访问我们的日历?

    iOS 上的 Sunrise 日历在版本 2 中添加了对 iCloud 日历的支持 从这一页 http blog sunrise im post 74146344289 about icloudSunrise 团队是这样说的 当您输入 iC
  • 带有行号列的 Flex DataGrid

    我想扩展 DataGrid 组件 以便有一个 只读 列用于显示行号 就像您在电子表格中看到的那样 我看到这篇文章http www cflex net showFileDetails cfm ObjectID 735 http www cfl
  • “swank-clojure”到底是做什么的,我们有“swank-SOMETHING_ELSE”吗?

    我的肤浅理解是 swank clojure 使 M x slime connect 成为可能 我的意思是 它提供了与 clojure 服务器的连接 例如 lein swank 我的理解正确吗 如果不是 那swank的目的是什么 那么 是否有
  • Wpf ICollectionView 绑定项无法解析类型对象的属性

    我已经绑定了一个GridView与ICollectionView在 XAML 设计器中 属性是未知的 因为CollectionView已转化为类型Object并且无法访问实体属性 它运行良好 没有错误 但设计器将其显示为错误 如果我绑定到集
  • Node.js 中的回调是始终异步还是始终同步?或者它们可以“有时是一个,有时是另一个”?

    我正在尝试在 Node js 中制作一些东西 并且我 像其他所有开始学习 Node 的人一样 对它的异步性质有疑问 我搜索了一下 但找不到关于它的具体问题的答案 也许我只是没有搜索得很好 所以这里是 一般来说 node js 回调是保证如果
  • django - 设置中带有数据库 url 的 MySQL 严格模式

    我在设置中使用数据库 URL 字符串 例如 DATABASES default mysql root localhost 3306 mydb 当我迁移时 我收到此警告 MySQL Strict Mode is not set for dat
  • 在工作区中找不到文件

    我使用 Visual Studio 2010 professional 和 TFS 作为源代码控制 一切正常 早上我来打开我的解决方案 它以离线状态打开 我尝试上网 它说 Workspace for this solution could
  • 如何为 CUDA 内核选择网格和块尺寸?

    这是一个关于如何确定CUDA网格 块和线程大小的问题 这是对已发布问题的附加问题here https stackoverflow com a 5643838 1292251 通过此链接 talonmies 的答案包含一个代码片段 见下文 我
  • Qt - 如何粘合两个窗口并将它们移动在一起?

    就像qmmp Qt 音乐播放器ui设计一样 这两个或三个窗口实际上在同一个窗口中 因为只有一个dock图标 并且这些窗口可以一起移动并相互附着 我看了源码 好像有用QDockWidget 但我真的不知道如何获得它的细节 当您手动移动辅助窗口
  • Nginx 是否也缓冲来自客户端的 http 请求?

    我知道 Nginx 可以缓冲来自上游服务器的响应 我的问题是 Nginx 是否也缓冲来自客户端的 http 请求 我的意思是 如果 Nginx 从客户端收到 http 请求 它是否立即与上游服务器建立连接 或者它会在收到整个http请求后创
  • 禁用触发 TextChanged 事件

    I have textbox我正在更改其中的文本lostFocus被解雇了 但这也激发了textChanged事件 我正在处理该事件 但我不希望在这种情况下触发它 我如何在这里禁用它 UPDATE 这个想法与bool很好 但我有几个文本框
  • 调用 event.preventDefault() 后是否有一种[通用]方法来调用默认操作?

    这个问题是为了开发 jQuery 插件和其他独立的 JavaScript 片段 不需要修改其他脚本文件来实现兼容性 我们都知道 event preventDefault 将阻止默认事件 因此我们可以运行自定义函数 但是如果我们想简单地怎么办
  • 隐藏“隧道到”会话

    我尝试隐藏 Chrome 社交部分生成的会话 但在主机列中隐藏标记为 隧道 的流量不起作用 尽管我成功地根据主机名模式隐藏了另一个会话 if oSession HTTPMethodIs CONNECT oSession ui hide y
  • 在 Swift 中将 gif 保存到 iOS 照片库

    我正在尝试保存位于已使用 Regift 代码创建的临时文件中的 GIF 图像 Regift https github com matthewpalmer Regift https github com matthewpalmer Regif
  • php 验证整数[重复]

    这个问题在这里已经有答案了 我想知道为什么这不起作用 echo gettype GET id returns string if is int GET id echo Integer 如何验证从 GET POST 传递的数据是否为整数 Ca
  • 求任意节点到一个节点的最小公共路径

    我的问题如下 我有一个 backup 节点和其他节点 从这些节点 我需要生成一个到备份节点的最小公共路径 未加权和无向图 我不需要每次都需要解决方案 我如何知道我是否可以生成这条路径 我正在考虑将图分成一些子图并搜索最小的 subpath
  • 将jquery与nodejs一起使用时的基本错误

    我正在尝试在我的项目中使用一些jquery 当我尝试使用它时 我在复制的代码中遇到了错误 并且无法获得任何有关它的谷歌帮助 var jquery require jquery var jquery create TypeError Obje
  • 自定义DataGridView列值在失去焦点后消失

    我在 WinForms 中为我的项目创建了一个自定义 DataGridViewColumn 该控件呈现完美 但一旦我输入值并移动到另一个单元格 当我签入 CellEndEdit 时 该值就会消失并显示为 null 以下是代码 class N