Quoting along the lines, updating values ββalong the way, is certainly a solution and quite simple:
foreach (DataRow row in table.Rows) { if (row.IsNull("foo")) row["foo"] = "-"; if (row.IsNull("bar")) row["bar"] = "-"; row["date"] = ((DateTime)row["date"]).Date; }
Alternatively, you can create new columns in the table using expressions to automatically create content:
table.Columns.Add("foo_dash", typeof(string), "IsNull(foo, '-')"); table.Columns.Add("bar_dash", typeof(string), "IsNull(bar, '-')");
(I don't know the date functions in ADO.NET, so you will need to display the last one.)
You tagged your ASP.NET post, so I assume it is reasonable to assume that you are going to bind your DataTable to some data management with several records ( GridView , Repeater , etc.). If so, it would be better to do the transformations during data binding:
protected void theGrid_OnRowDataBound(object sender, GridViewRowEventArgs e) { var data = e.DataItem as DataRowView; if (data != null) { if (data.Row.IsNull("foo")) e.Row.Cells[0] = "-"; if (data.Row.IsNull("bar")) e.Row.Cells[0] = "-"; } }
Although this requires a bit more code, it also gives you more flexibility. Example:
if (data.Row.IsNull("importantField")) e.Row.CssClass = "error";
In a GridView date can be formatted using a DataFormatString in a column declaration:
<asp:BoundField DataField="data" DataFormatString="{0:d}" />
Similarly when data binding a Repeater :
<%# Eval("date", "{0:d}") %>