2011-06-30 55 views
6

我試圖綁定一個GridView HyperLinkField,使綁定的列被用作URL中的參數值。相當標準的東西 - 沒有什麼奇特的,但是當綁定列包含冒號時,綁定失敗,即:。我是我的特例,這個值是一個表示持續時間的字符串,例如「14:35」或「1:07:19」。當綁定值包含冒號時如何綁定GridView HyperLinkField的URL?

這是我的GridView,綁定到HyperLinkField url的時間值。

<asp:GridView ID="ResultsGridView" runat="server" AutoGenerateColumns="False" 
    DataSourceID="ResultsDataSource" EnableModelValidation="True" 
     AllowPaging="True"> 
    <Columns> 
     <asp:BoundField DataField="Year" HeaderText="Year" SortExpression="Year" /> 
     <asp:HyperLinkField DataNavigateUrlFields="RunTime" 
      DataTextField="RunTime" HeaderText="Hyperlink" 
      DataNavigateUrlFormatString="LinkedPage.aspx?param={0}" /> 
     <asp:BoundField DataField="RunTime" HeaderText="Time" 
      SortExpression="RunTime" /> 
     <asp:BoundField DataField="FullName" HeaderText="Name" 
      SortExpression="FullName" ReadOnly="True" /> 
    </Columns> 
</asp:GridView> 

它產生這樣的HTML。請注意,<a>標籤沒有href屬性。

<tr> 
    <td>2010</td><td><a>34:58</a></td><td>34:58</td><td>Joe Schmoe</td> 
</tr><tr> 
    <td>2010</td><td><a>35:30</a></td><td>35:30</td><td>Rod Krueger</td> 
</tr><tr> 
    <td>2010</td><td><a>35:38</a></td><td>35:38</td><td>Mike Johnson</td> 
</tr> 

但是如果我切換綁定字段從運行時一年,即到不包含的值的冒號一列,它按預期工作。就拿GridView控件之上,並改變HyperLinkField字段的DataNavigateUrlFields屬性,就像這樣:

<asp:HyperLinkField DataNavigateUrlFields="Year" 
     DataTextField="RunTime" HeaderText="Hyperlink" 
     DataNavigateUrlFormatString="LinkedPage.aspx?param={0}" /> 

而現在的HTML輸出是正確的,是這樣的:

<tr> 
    <td>2010</td><td><a href="LinkedPage.aspx?param=2010">34:58</a></td><td>34:58</td><td>Joe Schmoe</td> 
</tr><tr> 
    <td>2010</td><td><a href="LinkedPage.aspx?param=2010">35:30</a></td><td>35:30</td><td>Rod Krueger</td> 
</tr><tr> 
    <td>2010</td><td><a href="LinkedPage.aspx?param=2010">35:38</a></td><td>35:38</td><td>Mike Johnson</td> 
</tr><tr> 

所以我的問題的螺母是此:如何將包含冒號的數據列綁定到HyperLinkField的URL?或者,如果失敗,請用另一種方法創建相同的綁定超鏈接?

將數據格式更改爲不包含冒號將是最後的手段,因爲LinkedPage.aspx需要該格式的參數值,並且已經寫入,測試並正在使用。

回答

8
<asp:TemplateField HeaderText="Hyperlink"> 
     <ItemTemplate> 
      <asp:HyperLink ID="HyperLink1" runat="server" 
       NavigateUrl='<%# Eval("RunTime", @"LinkedPage.aspx?param={0:hh\:mm}") %>' 
       Text='<%# Eval("RunTime", @"{0:hh\:mm}") %>'></asp:HyperLink> 
     </ItemTemplate> 
    </asp:TemplateField> 
+0

如何使用這個超鏈接加載第二個gridview在同一頁面? – aspiring

+1

@aspiring使用LinkBut​​ton或ImageButton,附加ItemCommand事件的處理程序,然後包含第二個網格的UpdatePanel。事件處理程序代碼用於綁定此網格的數據源。 –

+0

我不確定你是什麼意思的更新面板。當前字段是一個簡單的Boundfield,在gridview中顯示一個名稱。因此,如果我要使用鏈接按鈕,我將不得不找到一種方法來顯示鏈接按鈕上的數據作爲文本或者某事物。也許你可以發佈一個答案[here。](http://stackoverflow.com/q/30188620/2061309)我會搜索並嘗試你的建議。 – aspiring

1

哇,非常奇怪,糟糕的情況變得更糟,作爲最後一步,您可以隨時使用RowDataBound,並將單元格文本自行設置爲超鏈接HTML,但同時嘗試使用RowDataBound並檢查結果那裏。也許你可以在綁定時對值進行編碼,以便如果出現以下問題,編碼可能會解決它?

您可能還需要提交一個臭蟲connect.microsoft.com ...

HTH。

+0

謝謝@布萊恩,我會試試看。我懷疑它與「DataNavigateUrlFormatString」中的值佔位符的一部分使用的冒號有關,例如,如果我有格式化貨幣值,我可能會在格式字符串中使用{0:C}而不是{0}。 – Matt

+0

是的,這可能是有道理的,但我認爲這將只適用於如果你有{},但誰知道.. –