我有一个像下面这样的代码
txtbox1.Text = dtDetails.Rows[0]["columnName"] == null ? "--": dtDetails.Rows[0]["columnName"].ToString().Trim();
Run Code Online (Sandbox Code Playgroud)
上面一行是始终not null即使dtDetails.Rows[0]["columnName"] is null而
txtbox1.Text = dtDetails.Rows[0]["columnName"] == DBNull.Value ? "--": dtDetails.Rows[0]["columnName"].ToString().Trim();
Run Code Online (Sandbox Code Playgroud)
完美地工作。这是为什么?以及如何null不同DBNull.Value
ADO.NET ( DataSet, DataTable, 和DataRow) 代表 SQLNULL值DBNull.Value- 这是为了区分运行时 (C#/.NET)null和 SQL NULL。
我强烈建议阅读此 QA:DBNull 的意义何在?
您可以简化您的代码,顺便说一句使用DataRowExtensions- (添加对System.Data.DataSetExtensions.dll)
txtbox1.Text = dtDetails.Rows[0]["columnName"] == DBNull.Value ? "--": dtDetails.Rows[0]["columnName"].ToString().Trim();
Run Code Online (Sandbox Code Playgroud)
可以改为:
txtbox1.Text = dtDetails.Rows[0].Field<String>("columnName")?.Trim() ?? "--";
Run Code Online (Sandbox Code Playgroud)
该DataRowExtensions.Field<T>( this DataRow row, String name )延期方法检查DBNull.Value,并返回null-否则返回所需的字段,不寻找行动的开销DataRow值的两倍你的代码目前一样。
OP 说他们使用的是 Visual Studio 2010(在 2019 年?!),所以有几个选项:
如果您必须使用 VS2010(但为什么?)您可以破解您的 MSBuild 项目文件以使用更现代的 C# 编译器 - 但这是一个复杂的过程 - 并且没有 IDE 编辑器支持(所以你会得到红色波浪线任何地方,即使项目将构建良好)。
你可以改变的表达进行Trim() 后的?? "--"条款:
txtbox1.Text = ( dtDetails.Rows[0].Field<String>("columnName") ?? "--" ).Trim();
Run Code Online (Sandbox Code Playgroud)您可以使用扩展方法作为 lambda 中的黑客条件运算符:
static class Extensions
{
public static TOut N<TIn,TOut>( this TIn value, Func<TIn,TOut> whenNotNull )
where TIn : class
where TOut : class
{
if( value == null ) return null;
return whenNotNull( value );
}
}
Run Code Online (Sandbox Code Playgroud)
像这样使用:
txtbox1.Text = dtDetails.Rows[0].Field<String>("columnName").N( v => v.Trim() ) ?? "--";
Run Code Online (Sandbox Code Playgroud)或进一步扩展:
static class Extensions
{
public static TOut N<TIn,TOut>( this TIn value, Func<TOut> whenNull, Func<TIn,TOut> whenNotNull )
where TIn : class
where TOut : class
{
if( value == null ) return whenNull();
return whenNotNull( value );
}
}
Run Code Online (Sandbox Code Playgroud)
像这样使用:
txtbox1.Text = dtDetails.Rows[0].Field<String>("columnName").N( () => "--", v => v.Trim() );
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
2006 次 |
| 最近记录: |