You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DataGridViewLinkCell异常:C# SQL Server CRUD点击单元格程序崩溃求助

问题描述

我正在尝试用C#和SQL Server实现第一个CRUD功能,但每次运行程序点击不同单元格时,程序都会崩溃。以下是触发崩溃的代码:

private void MLA_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    DataGridViewLinkCell cell = (DataGridViewLinkCell)MLA.Rows[e.RowIndex].Cells[e.ColumnIndex];
    if (cell.Value.ToString() == "EDITAR")
    {
        AgregarMLA agregarMLA = new AgregarMLA();
        agregarMLA.LoadContact(new tablaMLA
        {

            URL_ID = int.Parse(MLA.Rows[e.RowIndex].Cells[0].Value.ToString()),
            URL_QUERY = (MLA.Rows[e.RowIndex].Cells[1]).Value.ToString()
        });
        agregarMLA.ShowDialog(this);
    }
    else if (cell.Value.ToString() == "BORRAR")
    {

        BorrarMLA(int.Parse(MLA.Rows[e.RowIndex].Cells[0].Value.ToString()));
        Populate();
    }
}

点击SQL Server查询结果的任意单元格都会崩溃,关于DataGridViewLinkCell的资料不多,我已经没别的办法尝试了。

修复方案

代码崩溃的核心原因是未做类型校验、空值处理和索引有效性检查,以下是修复后的完整代码及关键说明:

关键修复点

  • 排除表头点击:e.RowIndex为-1时直接返回,避免访问无效行
  • 校验单元格类型:仅处理DataGridViewLinkCell类型的单元格,避免强制转换错误
  • 空值与格式校验:对单元格值做空值判断,用int.TryParse替代int.Parse避免转换失败

修复后代码

private void MLA_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    // 点击表头时直接返回,避免无效行访问
    if (e.RowIndex < 0) return;

    // 仅处理链接单元格,跳过普通单元格点击
    if (!(MLA.Rows[e.RowIndex].Cells[e.ColumnIndex] is DataGridViewLinkCell linkCell))
    {
        return;
    }

    // 安全获取单元格文本,避免空引用
    string cellText = linkCell.Value?.ToString() ?? string.Empty;

    if (cellText == "EDITAR")
    {
        // 安全解析ID值,处理空值和格式错误
        var idValue = MLA.Rows[e.RowIndex].Cells[0].Value;
        if (idValue == null || !int.TryParse(idValue.ToString(), out int urlId))
        {
            MessageBox.Show("无法获取有效ID");
            return;
        }

        // 安全获取查询文本,空值转为空字符串
        string queryText = MLA.Rows[e.RowIndex].Cells[1].Value?.ToString() ?? string.Empty;

        AgregarMLA agregarMLA = new AgregarMLA();
        agregarMLA.LoadContact(new tablaMLA
        {
            URL_ID = urlId,
            URL_QUERY = queryText
        });
        agregarMLA.ShowDialog(this);
    }
    else if (cellText == "BORRAR")
    {
        var idValue = MLA.Rows[e.RowIndex].Cells[0].Value;
        if (idValue == null || !int.TryParse(idValue.ToString(), out int urlId))
        {
            MessageBox.Show("无法获取有效ID");
            return;
        }

        BorrarMLA(urlId);
        Populate();
    }
}

内容的提问来源于stack exchange,提问作者Juan Pablo Humani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 06:00:45