我在WinForm C#应用程序中有一个名为custFleetDataGrid
我尝试创建一种方法,如果所有行都是null
或""
代码无法按预期工作,具有空白数据的列仍保留在网格视图中。
我像这样调用代码
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;
}
}
答案 0 :(得分:1)
如果Value
为null
,如果使用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。