使Data列在DataGridView中不可见

时间:2016-06-15 06:48:00

标签: c# winforms datagridview

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

的datagridview

我尝试创建一种方法,如果所有行都是null""

,则会将每列设置为不可见

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

Blank Rows

我像这样调用代码

custFleetDataGrid.RemoveEmptyColumns();

方法I用于删除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;
    }
}

4 个答案:

答案 0 :(得分:1)

如果Valuenull,如果使用NullReferenceException,您将获得ToString()。因此,您必须null-check使用ToString() 之前的值

像这样:

// 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;
}

答案 1 :(得分: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;
}

答案 2 :(得分:0)

不是通过每行迭代,而是让我的select语句这样做: 从yourtable中选择一些列,其中列是非空的

答案 3 :(得分:0)

您的问题是您正在检查value是空还是空。如果toString()为null,则当它试图让if (row.Cells[clm.Index].Value != null || row.Cells[clm.Index].Value.toString()!="") { //Code } 检查它是否为空时它是否为空。

将您的if语句更改为:

""

重要提示:

在C#(和大多数现代语言)中,OR(|和||)有两个操作符,AND(&amp;&amp;&amp;)有两个操作符。如果它只是一个(&amp; / |)它将检查双方但如果它有两个(&amp;&amp; / ||)如果第一个condetin确定eveirthing(对于OR为真或对AND为假)它将不会检查第二个。

这为您提供了更多的基础知识,但对于没有nullpointerexeptions也很有用。如果它为null,则不会检查第二部分,也不会进行探索。如果您只是放一个,它会说“是,为空,让我们检查字符串是否也是if/then并且将抛出NulPointerExeption。