<%# Eval("SchoolEnd") == DBNull.Value ? "" : Convert.ToDateTime(Eval("SchoolEnd")).ToString("yyyy-MM-dd") %>html
不帶NULL的
<%# ((DateTime)Eval("SE_Start_Date")).ToString("yyyy-MM-dd") %>數組
<%#Eval("BeginDate", "{0:yyyy-MM-dd}")%> asp.net
、 爲何設置了DataFormatString沒有效果?ide
不要忽略BoundField的兩個重要屬性HtmlEncode和ApplyFormatInEditMode。
HtmlEncode
GridView 使用的 BoundField 與 DataGrid 使用 BoundColumn 不一樣,BounField 提供了一個 HtmlEncode 屬性,提供是否對數據進行HTML編碼,下降了 BoundColumn 潛在的Html &Script 嵌入攻擊,默認該值是啓用的。若是要使用格式化輸出,應該關閉此屬性。
<asp:BoundField DataField="HireDate" DataFormatString="{0:yyyy年M月d日}" HtmlEncode="false" HeaderText="HireDate" />
ApplyFormatInEditMode
默認狀況下,只有當數據綁定控件處於只讀模式時,格式化字符串才能應用到字段值。當數據綁定控件處於編輯模式時,若要將格式化字符串應用到顯示的值,應該同時將 ApplyFormatInEditMode 屬性設置爲 true。
<asp:BoundField DataField="HireDate" DataFormatString="{0:yyyy年M月d日}" HtmlEncode="false" HeaderText="HireDate" ApplyFormatInEditMode="true" />
二、 DataFormatString的格式
格式化字符串能夠爲任意字符串,而且一般包含字段值的佔位符。
例如:DataFormatString="aaa{n:bbb}ccc" ,其中的aaa和ccc表示任意的字符串;n是從零開始的參數列表中的字段值的索引,由於每一個單元格中只有一個字段值,因此n一般爲0;bbb爲格式字符串表明所們但願數據顯示的格式。
三、 GridView數據經常使用格式化類型
數字 {0:N2} 12.36
數字 {0:N0} 13
數字 {0:D} 12345 12345
數字 {0:D8} 12345 00012345
數字 {0:F} 12345.6789 12345.68
數字 {0:F0} 12345.6789 12346
數字 {0:G} 12345.6789 12345.6789
數字 {0:G7} 123456789 1.234568E8
貨幣 {0:c2} $12.36
貨幣 {0:c4} $12.3656
貨幣 "¥{0:N2}" ¥12.36
科學計數法 {0:E3} 1.23E+001
百分數 {0:P} 12.25%
日期 {0:D} 2006年11月25日
日期 {0:d} 2006-11-25
日期 {0:f} 2006年11月25日 10:30
日期 {0:F} 2006年11月25日 10:30:00
日期 {0:s} 2006-11-26 10:30:00
時間 {0:T} 10:30:00
時間 {0:t} 10:30
HyperLinkField
特別說明HyperLinkField,是由於實現了DataGrid的HyperLinkColumnd所不支持的,多參數格式化連接。一般咱們附加在url後面的QueryString不會只有一個,asp.net 1。x 中只有使用綁定列,而後手動寫代碼:
<asp:DataGrid id="DataGrid1" runat="server" DataSourceID="SqlDataSource1">
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<asp:HyperLink runat="server" Text="View Photo" NavigateUrl='<%# String.Format("photo.aspx?empid={0}&path={1}", Eval("EmployeeID"), Eval("PhotoPath")) %>'></asp:HyperLink>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
如今使用HyperLinkField,看下,省去不少苦力活:)
複製 保存
<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True"
AutoGenerateColumns="False" DataKeyNames="EmployeeID" DataSourceID="SqlDataSource1">
<Columns>
<asp:HyperLinkField DataNavigateUrlFields="EmployeeID,City" DataNavigateUrlFormatString="photo.aspx?empid={0}&path={1}"
HeaderText="PhotoPath" Text="View Photo" />
</Columns>
</asp:GridView>
注意:
一、.aspx中 DataNavigateUrlFields 中多個 Field 使用 , (逗號)分隔
二、裕綁定的Url 實際值,不能爲完整的絕對的路徑(如:http://www.cnblogs.com/Jinglecat/archive/2007/05/20/753284.html),而應該提供相對路徑(如:Jinglecat/archive/2007/05/20/753284.html),不然該URL整個不會被輸出,應該是HyperLinkField內部作了HTML監測,但它又不提供開關屬性如BoundField 的HtmlEncode給開發人員,應該算一個bug吧!
空值(Null)處理
若是字段的值爲空,則能夠經過設置 NullDisplayText 屬性顯示自定義標題。
經過將 ConvertEmptyStringToNull 屬性設置爲 true,BoundField 對象,也能夠將空字符串 ("") 字段值自動轉換爲空值。
1 前言
若是你熟悉Microsoft Foundation Classes(MFC)的CString,Windows Template Library(WTL)的CString或者Standard Template Library(STL)的字符串類,那麼你對String.Format方法確定很熟悉。在C#中也常用這個方法來格式化字符串,好比下面這樣:
int x = 16;
decimal y = 3.57m;
string h = String.Format( "item {0} sells at {1:C}", x, y );
Console.WriteLine(h);
在個人機器上,能夠獲得下面的輸出:
item 16 sells at ¥3.57
也許你的機器上的輸出和這個不太同樣。這是正常的,本文稍後就會解釋這個問題。
在咱們平常使用中,更多的是使用Console.WriteLine方法來輸出一個字符串。其實String.Format和Console.WriteLine有不少共同點。兩個方法都有不少重載的格式而且採用無固定參數的對象數組做爲最後一個參數。下面的兩個語句會產生一樣的輸出。
Console.WriteLine( "Hello {0} {1} {2} {3} {4} {5} {6} {7} {8}", 123, 45.67, true, 'Q', 4, 5, 6, 7, '8');
string u = String.Format("Hello {0} {1} {2} {3} {4} {5} {6} {7} {8}", 123, 45.67, true, 'Q', 4, 5, 6, 7, '8');
Console.WriteLine(u);
輸出以下:
Hello 123 45.67 True Q 4 5 6 7 8
Hello 123 45.67 True Q 4 5 6 7 8
2 字符串格式
String.Format和WriteLine都遵照一樣的格式化規則。格式化的格式以下:"{ N [, M ][: formatString ]}", arg1, ... argN,在這個格式中:
1) N是從0開始的整數,表示要格式化的參數的個數
2) M是一個可選的整數,表示格式化後的參數所佔的寬度,若是M是負數,那麼格式化後的值就是左對齊的,若是M是正數,那麼格式化後的值是右對齊的
3) formatString是另一個可選的參數,表示格式代碼
argN表示要格式化的表達式,和N是對應的。
若是argN是空值,那麼就用一個空字符串來代替。若是沒有formatString,那麼就用參數N對應的ToString方法來格式化。下面的語句會產生一樣的輸出:
public class TestConsoleApp
{
public static void Main(string[] args)
{
Console.WriteLine(123);
Console.WriteLine("{0}", 123);
Console.WriteLine("{0:D3}", 123);
}
}
輸出是:
123
123
123
也能夠經過String.Format獲得一樣的輸出。
string s = string.Format("123");
string t = string.Format("{0}", 123);
string u = string.Format("{0:D3}", 123);
Console.WriteLine(s);
Console.WriteLine(t);
Console.WriteLine(u);
所以有以下結論:
(,M)決定了格式化字符串的寬度和對齊方向
(:formatString)決定了如何格式化數據,好比用貨幣符號,科學計數法或者16進制。就像下面這樣:
Console.WriteLine("{0,5} {1,5}", 123, 456); // 右對齊
Console.WriteLine("{0,-5} {1,-5}", 123, 456); // 左對齊
輸出是
123 456
123 456
也能夠合併這些表達式,先放一個逗號,再放一個冒號。就像這樣:
Console.WriteLine("{0,-10:D6} {1,-10:D6}", 123, 456);
輸出是:
000123 000456
咱們能夠用這種格式化特性來對齊咱們的輸出。
Console.WriteLine("\n{0,-10}{1,-3}", "Name","Salary");
Console.WriteLine("----------------");
Console.WriteLine("{0,-10}{1,6}", "Bill", 123456);
Console.WriteLine("{0,-10}{1,6}", "Polly", 7890);
輸出是:
Name Salary
----------------
Bill 123456
Polly 7890
3 格式化標識符
標準的數學格式字符串用於返回一般使用的字符串。它們一般象X0這樣的格式。X是格式化標識符,0是精度標識符。格式標識符號共有9種,它們表明了大多數經常使用的數字格式。就像下表所示:
字母 含義
C或c Currency 貨幣格式
D或d Decimal 十進制格式(十進制整數,不要和.Net的Decimal數據類型混淆了)
E或e Exponent 指數格式
F或f Fixed point 固定精度格式
G或g General 經常使用格式
N或n 用逗號分割千位的數字,好比1234將會被變成1,234
P或p Percentage 百分符號格式
R或r Round-trip 圓整(只用於浮點數)保證一個數字被轉化成字符串之後能夠再被轉回成一樣的數字
X或x Hex 16進制格式
若是咱們使用下面的表達方式,讓咱們看看會發生什麼
public class FormatSpecApp
{
public static void Main(string[] args)
{
int i = 123456;
Console.WriteLine("{0:C}", i); // ¥123,456.00
Console.WriteLine("{0:D}", i); // 123456
Console.WriteLine("{0:E}", i); // 1.234560E+005
Console.WriteLine("{0:F}", i); // 123456.00
Console.WriteLine("{0:G}", i); // 123456
Console.WriteLine("{0:N}", i); // 123,456.00
Console.WriteLine("{0:P}", i); // 12,345,600.00 %
Console.WriteLine("{0:X}", i); // 1E240
}
}
精度控制標識控制了有效數字的個數或者十進制數小數的位數。
Console.WriteLine("{0:C5}", i); // ¥123,456.00
Console.WriteLine("{0:D5}", i); // 123456
Console.WriteLine("{0:E5}", i); // 1.23456E+005
Console.WriteLine("{0:F5}", i); // 123456.00000
Console.WriteLine("{0:G5}", i); // 1.23456E5
Console.WriteLine("{0:N5}", i); // 123,456.00000
Console.WriteLine("{0:P5}", i); // 12,345,600.00000 %
Console.WriteLine("{0:X5}", i); // 1E240
R(圓整)格式僅僅對浮點數有效。這個值首先會用通用格式來格式化。對於雙精度數有15位精度,對於單精度數有7位精度。若是這個值能夠被正確地解析回原始的數字,就會用通用格式符來格式化。若是不能解析回去的話,那麼就會用17位精度來格式化雙精度數,用9位精度來格式化單精度數。儘管咱們能夠在圓整標識符後面添加有效數字的位數,可是它會被忽略掉。
double d = 1.2345678901234567890;
Console.WriteLine("Floating-Point:\t{0:F16}", d); // 1.2345678901234600
Console.WriteLine("Roundtrip:\t{0:R16}", d); // 1.2345678901234567
若是標準格式化標識符還不能知足你。你可使用圖形化格式字符串來建立定製的字符串輸出。圖形化格式化使用佔位符來表示最小位數,
最大位數,定位符號,負號的外觀以及其它數字符號的外觀。就像下表所示
符號 名稱 含義
0 0佔位符 用0填充不足的位數
# 數字佔位符 用#代替實際的位數
. 十進制小數點
, 千位分隔符 用逗號進行千位分割,好比把1000分割成1,000
% 百分符號 顯示一個百分標識
E+0
E-0
e+0
e-0 指數符號 用指數符號格式化輸出
\ 專注字符 用於傳統格式的格式化序列,好比"\n"(新行)
'ABC'
"ABC" 常量字符串 顯示單引號或者雙引號裏面的字符串
; 區域分隔符 若是數字會被格式化成整數,負數,或者0,用;來進行分隔
,. 縮放符號 數字除以1000
看下面的例子:
double i = 123456.42;
Console.WriteLine();
Console.WriteLine("{0:000000.00}", i); //123456.42
Console.WriteLine("{0:00.00000000e+0}", i); //12.34564200e+4
Console.WriteLine("{0:0,.}", i); //123
Console.WriteLine("{0:#0.000}", i); // 123456.420
Console.WriteLine("{0:#0.000;(#0.000)}", i); // 123456.420
Console.WriteLine("{0:#0.000;(#0.000);<zero>}", i); // 123456.420
Console.WriteLine("{0:#%}", i); // 12345642%
i = -123456.42;
Console.WriteLine();
Console.WriteLine("{0:000000.00}", i); //-123456.42
Console.WriteLine("{0:00.00000000e+0}", i); //-12.34564200e+4
Console.WriteLine("{0:0,.}", i); //-123
Console.WriteLine("{0:#0.000}", i); // -123456.420
Console.WriteLine("{0:#0.000;(#0.000)}", i); // (123456.420)
Console.WriteLine("{0:#0;(#0);<zero>}", i); // (123456)
Console.WriteLine("{0:#%}", i); // -12345642%
i = 0;
Console.WriteLine();
Console.WriteLine("{0:0,.}", i); //0
Console.WriteLine("{0:#0}", i); // 0
Console.WriteLine("{0:#0;(#0)}", i); // 0
Console.WriteLine("{0:#0;(#0);<zero>}", i); // <zero>
Console.WriteLine("{0:#%}", i); // %
4 數字字符串的解析
全部的基礎類型都有ToString方法,它是從object類型中繼承過來的。全部的數值類型都有Parse方法,它用字符串爲參數,而且返回相等的數值。好比
public class NumParsingApp
{
public static void Main(string[] args)
{
int i = int.Parse("12345");
Console.WriteLine("i = {0}", i);
int j = Int32.Parse("12345");
Console.WriteLine("j = {0}", j);
double d = Double.Parse("1.2345E+6");
Console.WriteLine("d = {0:F}", d);
string s = i.ToString();
Console.WriteLine("s = {0}", s);
}
}
輸出以下
i = 12345
j = 12345
d = 1234500.00
s = 12345
在缺省情況下,某些非數字字符是能夠存在的。好比開頭和結尾的空白。逗號和小數點,加號和減號,所以,下面的Parse語句是同樣的
string t = " -1,234,567.890 ";
//double g = double.Parse(t); // 和下面的代碼幹一樣的事情
double g = double.Parse(t,
NumberStyles.AllowLeadingSign |
NumberStyles.AllowDecimalPoint |
NumberStyles.AllowThousands |
NumberStyles.AllowLeadingWhite |
NumberStyles.AllowTrailingWhite);
Console.WriteLine("g = {0:F}", g);
輸出都是這樣
g = -1234567.89
注意到,若是你要使用NumberStyles,就要添加對System.Globalization的引用,而後就可使用不一樣NumberStyles的組合或者其中的任意一種。若是你想兼容貨幣符號,就須要使用重載的Parse方法,它們採用了NumberFormatInfo對象做爲一個參數,而後你能夠設置NumberFormatInfo的CurrencySymbol屬性來調用Parse方法,好比:
string u = "¥ -1,234,567.890 ";
NumberFormatInfo ni = new NumberFormatInfo();
ni.CurrencySymbol = "¥";
double h = Double.Parse(u, NumberStyles.Any, ni);
Console.WriteLine("h = {0:F}", h);
上面的代碼有以下輸出
h = -1234567.89
除了NumberFormatInfo,還可使用CultureInfo類。CultureInfo表明了某種特定的文化,包括文化的名字,書寫的方式,日曆的格式。對於某種特定文化的操做是很是廣泛的狀況,好比格式化日期和排序。文化的命名方式聽從RFC1766標準,使用<語言代碼2>-<國家/地區碼2>的方式,其中的<語言代碼2>是兩個小寫的字母,它們來自ISO639-1;<國家/地區碼2>是兩個大寫字母,它們來自ISO3166。好比,美國英語是「en-US"。英國英語是"en-GB"。特立尼達和多巴哥英語是"en-TT"。例如,咱們能夠建立一個美國英語的CultureInfo對象而且基於這種文化將數字轉換成字符串。
int k = 12345;
CultureInfo us = new CultureInfo("en-US");
string v = k.ToString("c", us);
Console.WriteLine(v);
輸出是:
$12,345.00
要注意到,咱們使用了重載的ToString方法,它把第一個格式化字符串當成第一個參數,將一個CultureInfo對象(執行了IFormatProvider對象)做爲第二個參數。這兒有第二個例子,對於丹麥人來講:
CultureInfo dk = new CultureInfo("da-DK");
string w = k.ToString("c", dk);
Console.WriteLine(w);
輸出是:
kr 12.345,00
5 字符串和日期
一個日期對象有個叫Ticks的屬性。它存儲了自從公元1年的1月1號上午12點開始的,以100納秒爲間隔的時間。好比,Ticks值等於31241376000000000L表示公元100年,星期五,1月1號,上午12點這一時間。Ticks老是以100納秒爲間隔遞增。
DateTime的值以存儲在DateTimeFormatInfo實例裏面的標準或者自定義的方式來表示。爲了修改一個日期顯示的方式,DateTimeFormatInfo實例必需要是可寫的,以便咱們寫入自定義的格式而且存入屬性中
using System.Globalization;
public class DatesApp
{
public static void Main(string[] args)
{
DateTime dt = DateTime.Now;
Console.WriteLine(dt);
Console.WriteLine("date = {0}, time = {1}\n",
dt.Date, dt.TimeOfDay);
}
}
代碼會產生下面的輸出
23/06/2001 17:55:10
date = 23/06/2001 00:00:00, time = 17:55:10.3839296
下表列出了標準的格式字符串以及相關的DateTimeFormatInfo屬性
D
D MM/dd/yyyy ShortDatePattern(短日期模式)
D dddd,MMMM dd,yyyy LongDatePattern(長日期模式)
F dddd,MMMM dd,yyyy HH:mm Full date and time (long date and short time)(全日期和時間模式)
F dddd,MMMM dd,yyyy HH:mm:ss FullDateTimePattern (long date and long time)(長日期和長時間)
G MM/dd/yyyy HH:mm General (short date and short time)(通用模式,短日期和短期)
G MM/dd/yyyy HH:mm:ss General (short date and long time)(通用模式,短日期和長時間)
M,M MMMM dd MonthDayPattern(月天模式)
r,R ddd,dd MMM yyyy,HH':'mm':'ss 'GMT' RFC1123Pattern (RFC1123模式)
S yyyy-MM-dd HH:mm:ss SortableDateTimePattern (conforms to ISO 8601) using local time(使用本地時間的可排序模式)
T HH:mm ShortTimePattern (短期模式)
T HH:mm:ss LongTimePattern(長時間模式)
U yyyy-MM-dd HH:mm:ss UniversalSortable-DateTimePattern (conforms to ISO 8601) using universal time(通用可排序模式)
U dddd,MMMM dd,yyyy,HH:mm:ss UniversalSortable-DateTimePattern(通用可排序模式)
y,Y MMMM,yyyy YearMonthPattern(年月模式)
DateTimeFormatInfo.InvariantInfo屬性獲得了默認的只讀的DateTimeFormatInfo實例,它與文化無關。你能夠建立自定義的模式。要注意到的是InvariantInfo不必定和本地的格式同樣。Invariant等於美國格式。另外,若是你向DateTime.Format方法傳遞的第二個參數是null,DateTimeFormatInfo將會是默認的CurrentInfo。好比
Console.WriteLine(dt.ToString("d", dtfi));
Console.WriteLine(dt.ToString("d", null));
Console.WriteLine();
輸出是
06/23/2001
23/06/2001
對比選擇InvariantInfo和CurrentInfo的。
DateTimeFormatInfo dtfi;
Console.Write("[I]nvariant or [C]urrent Info?: ");
if (Console.Read() == 'I')
dtfi = DateTimeFormatInfo.InvariantInfo;
else
dtfi = DateTimeFormatInfo.CurrentInfo;
DateTimeFormatInfo dtfi = DateTimeFormatInfo.InvariantInfo;
Console.WriteLine(dt.ToString("D", dtfi));
Console.WriteLine(dt.ToString("f", dtfi));
Console.WriteLine(dt.ToString("F", dtfi));
Console.WriteLine(dt.ToString("g", dtfi));
Console.WriteLine(dt.ToString("G", dtfi));
Console.WriteLine(dt.ToString("m", dtfi));
Console.WriteLine(dt.ToString("r", dtfi));
Console.WriteLine(dt.ToString("s", dtfi));
Console.WriteLine(dt.ToString("t", dtfi));
Console.WriteLine(dt.ToString("T", dtfi));
Console.WriteLine(dt.ToString("u", dtfi));
Console.WriteLine(dt.ToString("U", dtfi));
Console.WriteLine(dt.ToString("d", dtfi));
Console.WriteLine(dt.ToString("y", dtfi));
Console.WriteLine(dt.ToString("dd-MMM-yy", dtfi));
輸出是
[I]nvariant or [C]urrent Info?: I
01/03/2002
03/01/2002
Thursday, 03 January 2002
Thursday, 03 January 2002 12:55
Thursday, 03 January 2002 12:55:03
01/03/2002 12:55
01/03/2002 12:55:03
January 03
Thu, 03 Jan 2002 12:55:03 GMT
2002-01-03T12:55:03
12:55
12:55:03
2002-01-03 12:55:03Z
Thursday, 03 January 2002 12:55:03
01/03/2002
2002 January
03-Jan-02
[I]nvariant or [C]urrent Info?: C
03/01/2002
03/01/2002
03 January 2002
03 January 2002 12:55
03 January 2002 12:55:47
03/01/2002 12:55
03/01/2002 12:55:47
03 January
Thu, 03 Jan 2002 12:55:47 GMT
2002-01-03T12:55:47
12:55
12:55:47編碼
<%# Eval("SchoolEnd") == DBNull.Value ? "" : Convert.ToDateTime(Eval("SchoolEnd")).ToString("yyyy-MM-dd") %>url
不帶NULL的
<%# ((DateTime)Eval("SE_Start_Date")).ToString("yyyy-MM-dd") %>.net
<%#Eval("BeginDate", "{0:yyyy-MM-dd}")%> code
、 爲何設置了DataFormatString沒有效果?orm
不要忽略BoundField的兩個重要屬性HtmlEncode和ApplyFormatInEditMode。
HtmlEncode
GridView 使用的 BoundField 與 DataGrid 使用 BoundColumn 不一樣,BounField 提供了一個 HtmlEncode 屬性,提供是否對數據進行HTML編碼,下降了 BoundColumn 潛在的Html &Script 嵌入攻擊,默認該值是啓用的。若是要使用格式化輸出,應該關閉此屬性。
<asp:BoundField DataField="HireDate" DataFormatString="{0:yyyy年M月d日}" HtmlEncode="false" HeaderText="HireDate" />
ApplyFormatInEditMode
默認狀況下,只有當數據綁定控件處於只讀模式時,格式化字符串才能應用到字段值。當數據綁定控件處於編輯模式時,若要將格式化字符串應用到顯示的值,應該同時將 ApplyFormatInEditMode 屬性設置爲 true。
<asp:BoundField DataField="HireDate" DataFormatString="{0:yyyy年M月d日}" HtmlEncode="false" HeaderText="HireDate" ApplyFormatInEditMode="true" />
二、 DataFormatString的格式
格式化字符串能夠爲任意字符串,而且一般包含字段值的佔位符。
例如:DataFormatString="aaa{n:bbb}ccc" ,其中的aaa和ccc表示任意的字符串;n是從零開始的參數列表中的字段值的索引,由於每一個單元格中只有一個字段值,因此n一般爲0;bbb爲格式字符串表明所們但願數據顯示的格式。
三、 GridView數據經常使用格式化類型
數字 {0:N2} 12.36
數字 {0:N0} 13
數字 {0:D} 12345 12345
數字 {0:D8} 12345 00012345
數字 {0:F} 12345.6789 12345.68
數字 {0:F0} 12345.6789 12346
數字 {0:G} 12345.6789 12345.6789
數字 {0:G7} 123456789 1.234568E8
貨幣 {0:c2} $12.36
貨幣 {0:c4} $12.3656
貨幣 "¥{0:N2}" ¥12.36
科學計數法 {0:E3} 1.23E+001
百分數 {0:P} 12.25%
日期 {0:D} 2006年11月25日
日期 {0:d} 2006-11-25
日期 {0:f} 2006年11月25日 10:30
日期 {0:F} 2006年11月25日 10:30:00
日期 {0:s} 2006-11-26 10:30:00
時間 {0:T} 10:30:00
時間 {0:t} 10:30
HyperLinkField
特別說明HyperLinkField,是由於實現了DataGrid的HyperLinkColumnd所不支持的,多參數格式化連接。一般咱們附加在url後面的QueryString不會只有一個,asp.net 1。x 中只有使用綁定列,而後手動寫代碼:
<asp:DataGrid id="DataGrid1" runat="server" DataSourceID="SqlDataSource1">
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<asp:HyperLink runat="server" Text="View Photo" NavigateUrl='<%# String.Format("photo.aspx?empid={0}&path={1}", Eval("EmployeeID"), Eval("PhotoPath")) %>'></asp:HyperLink>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
如今使用HyperLinkField,看下,省去不少苦力活:)
複製 保存
<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True"
AutoGenerateColumns="False" DataKeyNames="EmployeeID" DataSourceID="SqlDataSource1">
<Columns>
<asp:HyperLinkField DataNavigateUrlFields="EmployeeID,City" DataNavigateUrlFormatString="photo.aspx?empid={0}&path={1}"
HeaderText="PhotoPath" Text="View Photo" />
</Columns>
</asp:GridView>
注意:
一、.aspx中 DataNavigateUrlFields 中多個 Field 使用 , (逗號)分隔
二、裕綁定的Url 實際值,不能爲完整的絕對的路徑(如:http://www.cnblogs.com/Jinglecat/archive/2007/05/20/753284.html),而應該提供相對路徑(如:Jinglecat/archive/2007/05/20/753284.html),不然該URL整個不會被輸出,應該是HyperLinkField內部作了HTML監測,但它又不提供開關屬性如BoundField 的HtmlEncode給開發人員,應該算一個bug吧!
空值(Null)處理
若是字段的值爲空,則能夠經過設置 NullDisplayText 屬性顯示自定義標題。
經過將 ConvertEmptyStringToNull 屬性設置爲 true,BoundField 對象,也能夠將空字符串 ("") 字段值自動轉換爲空值。
1 前言
若是你熟悉Microsoft Foundation Classes(MFC)的CString,Windows Template Library(WTL)的CString或者Standard Template Library(STL)的字符串類,那麼你對String.Format方法確定很熟悉。在C#中也常用這個方法來格式化字符串,好比下面這樣:
int x = 16;
decimal y = 3.57m;
string h = String.Format( "item {0} sells at {1:C}", x, y );
Console.WriteLine(h);
在個人機器上,能夠獲得下面的輸出:
item 16 sells at ¥3.57
也許你的機器上的輸出和這個不太同樣。這是正常的,本文稍後就會解釋這個問題。
在咱們平常使用中,更多的是使用Console.WriteLine方法來輸出一個字符串。其實String.Format和Console.WriteLine有不少共同點。兩個方法都有不少重載的格式而且採用無固定參數的對象數組做爲最後一個參數。下面的兩個語句會產生一樣的輸出。
Console.WriteLine( "Hello {0} {1} {2} {3} {4} {5} {6} {7} {8}", 123, 45.67, true, 'Q', 4, 5, 6, 7, '8');
string u = String.Format("Hello {0} {1} {2} {3} {4} {5} {6} {7} {8}", 123, 45.67, true, 'Q', 4, 5, 6, 7, '8');
Console.WriteLine(u);
輸出以下:
Hello 123 45.67 True Q 4 5 6 7 8
Hello 123 45.67 True Q 4 5 6 7 8
2 字符串格式
String.Format和WriteLine都遵照一樣的格式化規則。格式化的格式以下:"{ N [, M ][: formatString ]}", arg1, ... argN,在這個格式中:
1) N是從0開始的整數,表示要格式化的參數的個數
2) M是一個可選的整數,表示格式化後的參數所佔的寬度,若是M是負數,那麼格式化後的值就是左對齊的,若是M是正數,那麼格式化後的值是右對齊的
3) formatString是另一個可選的參數,表示格式代碼
argN表示要格式化的表達式,和N是對應的。
若是argN是空值,那麼就用一個空字符串來代替。若是沒有formatString,那麼就用參數N對應的ToString方法來格式化。下面的語句會產生一樣的輸出:
public class TestConsoleApp
{
public static void Main(string[] args)
{
Console.WriteLine(123);
Console.WriteLine("{0}", 123);
Console.WriteLine("{0:D3}", 123);
}
}
輸出是:
123
123
123
也能夠經過String.Format獲得一樣的輸出。
string s = string.Format("123");
string t = string.Format("{0}", 123);
string u = string.Format("{0:D3}", 123);
Console.WriteLine(s);
Console.WriteLine(t);
Console.WriteLine(u);
所以有以下結論:
(,M)決定了格式化字符串的寬度和對齊方向
(:formatString)決定了如何格式化數據,好比用貨幣符號,科學計數法或者16進制。就像下面這樣:
Console.WriteLine("{0,5} {1,5}", 123, 456); // 右對齊
Console.WriteLine("{0,-5} {1,-5}", 123, 456); // 左對齊
輸出是
123 456
123 456
也能夠合併這些表達式,先放一個逗號,再放一個冒號。就像這樣:
Console.WriteLine("{0,-10:D6} {1,-10:D6}", 123, 456);
輸出是:
000123 000456
咱們能夠用這種格式化特性來對齊咱們的輸出。
Console.WriteLine("\n{0,-10}{1,-3}", "Name","Salary");
Console.WriteLine("----------------");
Console.WriteLine("{0,-10}{1,6}", "Bill", 123456);
Console.WriteLine("{0,-10}{1,6}", "Polly", 7890);
輸出是:
Name Salary
----------------
Bill 123456
Polly 7890
3 格式化標識符
標準的數學格式字符串用於返回一般使用的字符串。它們一般象X0這樣的格式。X是格式化標識符,0是精度標識符。格式標識符號共有9種,它們表明了大多數經常使用的數字格式。就像下表所示:
字母 含義
C或c Currency 貨幣格式
D或d Decimal 十進制格式(十進制整數,不要和.Net的Decimal數據類型混淆了)
E或e Exponent 指數格式
F或f Fixed point 固定精度格式
G或g General 經常使用格式
N或n 用逗號分割千位的數字,好比1234將會被變成1,234
P或p Percentage 百分符號格式
R或r Round-trip 圓整(只用於浮點數)保證一個數字被轉化成字符串之後能夠再被轉回成一樣的數字
X或x Hex 16進制格式
若是咱們使用下面的表達方式,讓咱們看看會發生什麼
public class FormatSpecApp
{
public static void Main(string[] args)
{
int i = 123456;
Console.WriteLine("{0:C}", i); // ¥123,456.00
Console.WriteLine("{0:D}", i); // 123456
Console.WriteLine("{0:E}", i); // 1.234560E+005
Console.WriteLine("{0:F}", i); // 123456.00
Console.WriteLine("{0:G}", i); // 123456
Console.WriteLine("{0:N}", i); // 123,456.00
Console.WriteLine("{0:P}", i); // 12,345,600.00 %
Console.WriteLine("{0:X}", i); // 1E240
}
}
精度控制標識控制了有效數字的個數或者十進制數小數的位數。
Console.WriteLine("{0:C5}", i); // ¥123,456.00
Console.WriteLine("{0:D5}", i); // 123456
Console.WriteLine("{0:E5}", i); // 1.23456E+005
Console.WriteLine("{0:F5}", i); // 123456.00000
Console.WriteLine("{0:G5}", i); // 1.23456E5
Console.WriteLine("{0:N5}", i); // 123,456.00000
Console.WriteLine("{0:P5}", i); // 12,345,600.00000 %
Console.WriteLine("{0:X5}", i); // 1E240
R(圓整)格式僅僅對浮點數有效。這個值首先會用通用格式來格式化。對於雙精度數有15位精度,對於單精度數有7位精度。若是這個值能夠被正確地解析回原始的數字,就會用通用格式符來格式化。若是不能解析回去的話,那麼就會用17位精度來格式化雙精度數,用9位精度來格式化單精度數。儘管咱們能夠在圓整標識符後面添加有效數字的位數,可是它會被忽略掉。
double d = 1.2345678901234567890;
Console.WriteLine("Floating-Point:\t{0:F16}", d); // 1.2345678901234600
Console.WriteLine("Roundtrip:\t{0:R16}", d); // 1.2345678901234567
若是標準格式化標識符還不能知足你。你可使用圖形化格式字符串來建立定製的字符串輸出。圖形化格式化使用佔位符來表示最小位數,
最大位數,定位符號,負號的外觀以及其它數字符號的外觀。就像下表所示
符號 名稱 含義
0 0佔位符 用0填充不足的位數
# 數字佔位符 用#代替實際的位數
. 十進制小數點
, 千位分隔符 用逗號進行千位分割,好比把1000分割成1,000
% 百分符號 顯示一個百分標識
E+0
E-0
e+0
e-0 指數符號 用指數符號格式化輸出
\ 專注字符 用於傳統格式的格式化序列,好比"\n"(新行)
'ABC'
"ABC" 常量字符串 顯示單引號或者雙引號裏面的字符串
; 區域分隔符 若是數字會被格式化成整數,負數,或者0,用;來進行分隔
,. 縮放符號 數字除以1000
看下面的例子:
double i = 123456.42;
Console.WriteLine();
Console.WriteLine("{0:000000.00}", i); //123456.42
Console.WriteLine("{0:00.00000000e+0}", i); //12.34564200e+4
Console.WriteLine("{0:0,.}", i); //123
Console.WriteLine("{0:#0.000}", i); // 123456.420
Console.WriteLine("{0:#0.000;(#0.000)}", i); // 123456.420
Console.WriteLine("{0:#0.000;(#0.000);<zero>}", i); // 123456.420
Console.WriteLine("{0:#%}", i); // 12345642%
i = -123456.42;
Console.WriteLine();
Console.WriteLine("{0:000000.00}", i); //-123456.42
Console.WriteLine("{0:00.00000000e+0}", i); //-12.34564200e+4
Console.WriteLine("{0:0,.}", i); //-123
Console.WriteLine("{0:#0.000}", i); // -123456.420
Console.WriteLine("{0:#0.000;(#0.000)}", i); // (123456.420)
Console.WriteLine("{0:#0;(#0);<zero>}", i); // (123456)
Console.WriteLine("{0:#%}", i); // -12345642%
i = 0;
Console.WriteLine();
Console.WriteLine("{0:0,.}", i); //0
Console.WriteLine("{0:#0}", i); // 0
Console.WriteLine("{0:#0;(#0)}", i); // 0
Console.WriteLine("{0:#0;(#0);<zero>}", i); // <zero>
Console.WriteLine("{0:#%}", i); // %
4 數字字符串的解析
全部的基礎類型都有ToString方法,它是從object類型中繼承過來的。全部的數值類型都有Parse方法,它用字符串爲參數,而且返回相等的數值。好比
public class NumParsingApp
{
public static void Main(string[] args)
{
int i = int.Parse("12345");
Console.WriteLine("i = {0}", i);
int j = Int32.Parse("12345");
Console.WriteLine("j = {0}", j);
double d = Double.Parse("1.2345E+6");
Console.WriteLine("d = {0:F}", d);
string s = i.ToString();
Console.WriteLine("s = {0}", s);
}
}
輸出以下
i = 12345
j = 12345
d = 1234500.00
s = 12345
在缺省情況下,某些非數字字符是能夠存在的。好比開頭和結尾的空白。逗號和小數點,加號和減號,所以,下面的Parse語句是同樣的
string t = " -1,234,567.890 ";
//double g = double.Parse(t); // 和下面的代碼幹一樣的事情
double g = double.Parse(t,
NumberStyles.AllowLeadingSign |
NumberStyles.AllowDecimalPoint |
NumberStyles.AllowThousands |
NumberStyles.AllowLeadingWhite |
NumberStyles.AllowTrailingWhite);
Console.WriteLine("g = {0:F}", g);
輸出都是這樣
g = -1234567.89
注意到,若是你要使用NumberStyles,就要添加對System.Globalization的引用,而後就可使用不一樣NumberStyles的組合或者其中的任意一種。若是你想兼容貨幣符號,就須要使用重載的Parse方法,它們採用了NumberFormatInfo對象做爲一個參數,而後你能夠設置NumberFormatInfo的CurrencySymbol屬性來調用Parse方法,好比:
string u = "¥ -1,234,567.890 ";
NumberFormatInfo ni = new NumberFormatInfo();
ni.CurrencySymbol = "¥";
double h = Double.Parse(u, NumberStyles.Any, ni);
Console.WriteLine("h = {0:F}", h);
上面的代碼有以下輸出
h = -1234567.89
除了NumberFormatInfo,還可使用CultureInfo類。CultureInfo表明了某種特定的文化,包括文化的名字,書寫的方式,日曆的格式。對於某種特定文化的操做是很是廣泛的狀況,好比格式化日期和排序。文化的命名方式聽從RFC1766標準,使用<語言代碼2>-<國家/地區碼2>的方式,其中的<語言代碼2>是兩個小寫的字母,它們來自ISO639-1;<國家/地區碼2>是兩個大寫字母,它們來自ISO3166。好比,美國英語是「en-US"。英國英語是"en-GB"。特立尼達和多巴哥英語是"en-TT"。例如,咱們能夠建立一個美國英語的CultureInfo對象而且基於這種文化將數字轉換成字符串。
int k = 12345;
CultureInfo us = new CultureInfo("en-US");
string v = k.ToString("c", us);
Console.WriteLine(v);
輸出是:
$12,345.00
要注意到,咱們使用了重載的ToString方法,它把第一個格式化字符串當成第一個參數,將一個CultureInfo對象(執行了IFormatProvider對象)做爲第二個參數。這兒有第二個例子,對於丹麥人來講:
CultureInfo dk = new CultureInfo("da-DK");
string w = k.ToString("c", dk);
Console.WriteLine(w);
輸出是:
kr 12.345,00
5 字符串和日期
一個日期對象有個叫Ticks的屬性。它存儲了自從公元1年的1月1號上午12點開始的,以100納秒爲間隔的時間。好比,Ticks值等於31241376000000000L表示公元100年,星期五,1月1號,上午12點這一時間。Ticks老是以100納秒爲間隔遞增。
DateTime的值以存儲在DateTimeFormatInfo實例裏面的標準或者自定義的方式來表示。爲了修改一個日期顯示的方式,DateTimeFormatInfo實例必需要是可寫的,以便咱們寫入自定義的格式而且存入屬性中
using System.Globalization;
public class DatesApp
{
public static void Main(string[] args)
{
DateTime dt = DateTime.Now;
Console.WriteLine(dt);
Console.WriteLine("date = {0}, time = {1}\n",
dt.Date, dt.TimeOfDay);
}
}
代碼會產生下面的輸出
23/06/2001 17:55:10
date = 23/06/2001 00:00:00, time = 17:55:10.3839296
下表列出了標準的格式字符串以及相關的DateTimeFormatInfo屬性
D
D MM/dd/yyyy ShortDatePattern(短日期模式)
D dddd,MMMM dd,yyyy LongDatePattern(長日期模式)
F dddd,MMMM dd,yyyy HH:mm Full date and time (long date and short time)(全日期和時間模式)
F dddd,MMMM dd,yyyy HH:mm:ss FullDateTimePattern (long date and long time)(長日期和長時間)
G MM/dd/yyyy HH:mm General (short date and short time)(通用模式,短日期和短期)
G MM/dd/yyyy HH:mm:ss General (short date and long time)(通用模式,短日期和長時間)
M,M MMMM dd MonthDayPattern(月天模式)
r,R ddd,dd MMM yyyy,HH':'mm':'ss 'GMT' RFC1123Pattern (RFC1123模式)
S yyyy-MM-dd HH:mm:ss SortableDateTimePattern (conforms to ISO 8601) using local time(使用本地時間的可排序模式)
T HH:mm ShortTimePattern (短期模式)
T HH:mm:ss LongTimePattern(長時間模式)
U yyyy-MM-dd HH:mm:ss UniversalSortable-DateTimePattern (conforms to ISO 8601) using universal time(通用可排序模式)
U dddd,MMMM dd,yyyy,HH:mm:ss UniversalSortable-DateTimePattern(通用可排序模式)
y,Y MMMM,yyyy YearMonthPattern(年月模式)
DateTimeFormatInfo.InvariantInfo屬性獲得了默認的只讀的DateTimeFormatInfo實例,它與文化無關。你能夠建立自定義的模式。要注意到的是InvariantInfo不必定和本地的格式同樣。Invariant等於美國格式。另外,若是你向DateTime.Format方法傳遞的第二個參數是null,DateTimeFormatInfo將會是默認的CurrentInfo。好比
Console.WriteLine(dt.ToString("d", dtfi));
Console.WriteLine(dt.ToString("d", null));
Console.WriteLine();
輸出是
06/23/2001
23/06/2001
對比選擇InvariantInfo和CurrentInfo的。
DateTimeFormatInfo dtfi;
Console.Write("[I]nvariant or [C]urrent Info?: ");
if (Console.Read() == 'I')
dtfi = DateTimeFormatInfo.InvariantInfo;
else
dtfi = DateTimeFormatInfo.CurrentInfo;
DateTimeFormatInfo dtfi = DateTimeFormatInfo.InvariantInfo;
Console.WriteLine(dt.ToString("D", dtfi));
Console.WriteLine(dt.ToString("f", dtfi));
Console.WriteLine(dt.ToString("F", dtfi));
Console.WriteLine(dt.ToString("g", dtfi));
Console.WriteLine(dt.ToString("G", dtfi));
Console.WriteLine(dt.ToString("m", dtfi));
Console.WriteLine(dt.ToString("r", dtfi));
Console.WriteLine(dt.ToString("s", dtfi));
Console.WriteLine(dt.ToString("t", dtfi));
Console.WriteLine(dt.ToString("T", dtfi));
Console.WriteLine(dt.ToString("u", dtfi));
Console.WriteLine(dt.ToString("U", dtfi));
Console.WriteLine(dt.ToString("d", dtfi));
Console.WriteLine(dt.ToString("y", dtfi));
Console.WriteLine(dt.ToString("dd-MMM-yy", dtfi));
輸出是
[I]nvariant or [C]urrent Info?: I
01/03/2002
03/01/2002
Thursday, 03 January 2002
Thursday, 03 January 2002 12:55
Thursday, 03 January 2002 12:55:03
01/03/2002 12:55
01/03/2002 12:55:03
January 03
Thu, 03 Jan 2002 12:55:03 GMT
2002-01-03T12:55:03
12:55
12:55:03
2002-01-03 12:55:03Z
Thursday, 03 January 2002 12:55:03
01/03/2002
2002 January
03-Jan-02
[I]nvariant or [C]urrent Info?: C
03/01/2002
03/01/2002
03 January 2002
03 January 2002 12:55
03 January 2002 12:55:47
03/01/2002 12:55
03/01/2002 12:55:47
03 January
Thu, 03 Jan 2002 12:55:47 GMT
2002-01-03T12:55:47
12:55
12:55:47server