【问题标题】:Make null columns invisible in DataGridView在 DataGridView 中使空列不可见
【发布时间】:2016-06-15 06:47:59
【问题描述】:

我在 WinForm C# 应用程序中有一个名为 custFleetDataGrid 的 datagridview

我尝试创建一个方法,如果所有行都是null"",则将每列设置为不可见

代码未按预期工作,带有空白数据的列仍保留在网格视图中。

我这样调用代码

custFleetDataGrid.RemoveEmptyColumns();

我用来删除 NullColumns 的方法

public static class ExtensionGridView
{
    public static DataGridView RemoveEmptyColumns(this DataGridView grdView)
    {
        foreach (DataGridViewColumn clm in grdView.Columns)
        {
            bool notAvailable = true;

            foreach (DataGridViewRow row in grdView.Rows)
            {

                if (row.Cells[clm.Index].Value == null || row.Cells[clm.Index].Value.ToString() != "")
                {
                    notAvailable = false;
                    break;
                }
            }

            if (notAvailable)
            {
                grdView.Columns[clm.Index].Visible = false;
            }
        }

        return grdView;
    }
}

【问题讨论】:

  • @Brendon 你正在尝试获取一个空的CellValue。所以检查Cell 是否为空然后尝试获取Value
  • 好吧...我该如何解决?
  • @Chaitanya Valuenull,而不是 Cell 本身。检查我的答案。因此,.ToString() 导致了异常。

标签: c# winforms datagridview


【解决方案1】:

这可能是因为编译器试图将空值转换为字符串吗?

没错,就是这样。只是不是编译器,而是你写的代码。

我建议您将空单元格逻辑封装到 ExtensionGridView 类中的单独扩展方法中:

public static bool IsEmpty(this DataGridViewCell cell)
{
    var value = cell.Value;
    return value == null || value == DBNull.Value || (value as string) == string.Empty;
}

然后你可以使用简单的 LINQ 来确定空列:

public static IEnumerable<DataGridViewColumn> EmptyColumns(this DataGridView gridView)
{
    return gridView.Columns.Cast<DataGridViewColumn>()
        .Where(c => gridView.Rows.Cast<DataGridViewRow>().All(r => r.Cells[c.Index].IsEmpty()));
}

那么你的方法可以是这样的:

public static DataGridView RemoveEmptyColumns(this DataGridView gridView)
{
    foreach (var column in gridView.EmptyColumns())
        column.Visible = false;
    return gridView;
}

【讨论】:

  • 它会,如果你把所有这些方法都放在ExtensionGridView 类中,如帖子中所述。
  • 您忘记从答案中复制public static bool IsEmpty(this DataGridViewCell cell) 方法。
  • 另外,代码好像删除了一些不为空的列?这是在dropbox.com/s/26a8q7giqea3iir/Before.JPG?dl=0 之前,这是在dropbox.com/s/4z018ii2zpmgdcd/After.JPG?dl=0 之后
  • 这很奇怪。试图重现,但不能。你能在column.Visible = false; 行下一个断点,看看它是否被错误的列调用。
  • 是的,它正在调用错误的列!有什么想法吗??
【解决方案2】:

如果Valuenull,如果在其上使用ToString(),您将获得NullReferenceException。所以你必须使用ToString()null-check之前

像这样去:

// IF (Value is empty => use "").ToString() <-- IsNullOrEmpty
if (!string.IsNullOrEmpty(row.Cells[clm.Index].Value ?? "").ToString())
{
    notAvailable = false;
    break;
}

查看??here的详细信息。

同理:

// If not null
if(row.Cells[clm.Index].Value != null)
{
    // If string of value is empty
    if(row.Cells[clm.Index].Value.ToString() != "")
    {
        notAvailable = false;
        break;
    }
}

除了你的问题,这里是所有内容的简短版本:

public static DataGridView RemoveEmptyColumns(this DataGridView grdView)
{
    for (int i = 0; i < grdView.ColumnCount; i++)
    {
        // On each iteration get all values of a column
        IEnumerable<string> column = grdView.Rows.Cast<DataGridViewRow>().Select(row => (string)row.Cells[i].Value);
        // If there is no value with length > 0 => visible = false
        if (!column.Any(x => x.Length > 0)) { grdView.Columns[i].Visible = false; }
    }

    return grdView;
}

【讨论】:

  • 参数类型“对象”不能分配给参数类型字符串?
  • @BrendanGooden 修复了它。
  • 谢谢。但是代码没有隐藏列。你觉得有什么理由吗?
  • @BrendanGooden 我的if 仍然存在问题。现在终于修好了。另外,bool notAvailable 有问题。附加了一些代码。
  • @BrendanGooden 是的。只需将您的IF 替换为我的即可。
【解决方案3】:

而不是遍历每一行,我会让我的 select 语句这样做: SELECT some columns FROM yourtable WHERE thecolumn IS NOT NULL

【讨论】:

  • 那么它根本不会得到该行。如果所有行都没有该列的数据,他需要使该列不可见。因此,如果没有用户在 surname 列上有数据,则 surname 列将不可见。您的查询不会选择任何数据
  • 也许我误解了这个问题,我在想他想要一个空栏吗?查询只会选择至少一行有数据的列。
【解决方案4】:

您的问题是您正在检查row.value.toString() 是空还是空。如果value为null,当它试图获取toString()来检查它是否为null或为空时它不能。

将你的 if 语句更改为:

if (row.Cells[clm.Index].Value != null || row.Cells[clm.Index].Value.toString()!="")
{
    //Code
}

重要提示:

在 C#(和大多数现代语言)中,您有两个用于 OR(| 和 ||)的操作符和两个用于 AND(& &&)的操作符。如果它只有一个 (&/|),它将检查双方,但如果它有两个 (&&/||),如果第一个条件确定所有内容(OR 为真,AND 为假),它将不会检查第二个。

这为您提供了更多的解释,但对于没有 nullpointerexeptions 也很有用。如果为空,则不会检查第二部分,也不会展开。如果你只放一个,它会说“是的,为空,让我们检查字符串是否也是 "" 并抛出 NulPointerExeption。

【讨论】:

  • 他正在检查 Not 是否为空。将其更改为!= null
  • 这无论如何都行不通。如果Value == null 它将跳转到第二个条件并再次提高NullReferenceException,因为toString() 不能在null 值上调用。
猜你喜欢
  • 2012-05-30
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多