我可以有一個所有填寫欄位的記錄,然后沒有 SO_ID 或 SO_Num。我希望我的 eval 能夠處理這些,并在發生這種情況時在網格列中回傳一個“-”,同時仍然回傳該行的所有其他資料。我在網上嘗試了其他解決方案,但找不到有效的解決方案。
<dx:GridViewDataColumn FieldName="SO_Num" VisibleIndex="19" runat="server" Caption="Sales Order Number">
<DataItemTemplate>
<a id="clickElement" href="../sales/order/view.aspx?ID=<%# Eval("SO_ID").ToString()%>"><%#Eval("SO_Num").ToString()%></a>
</DataItemTemplate>
</dx:GridViewDataColumn>
uj5u.com熱心網友回復:
您可以使用行內的“iif()”,因此:
<asp:TemplateField HeaderText="City">
<ItemTemplate>
<asp:TextBox ID="txtCity" runat="server"
Text = '<%# IIf(IsDBNull(Eval("City")), "-", Eval("City")) %>'
></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
所以,在上面,如果說 Eval("City") 為空,那么我們顯示一個“-”,否則我們顯示 Eval("City")
編輯:值的顯示和一些單擊和導航的按鈕是不同的!
正如我所指出的,如果您需要 GridView 中的 Eval(),并且想要將 null 說轉換為“-”,那么就這樣做(但是,我不明白為什么我想在其中顯示一些“-” GV. 為什么這樣做??我覺得很奇怪?
但是,如果您在 GV 行上有一個按鈕,并且您想單擊該按鈕以跳轉或導航到其他頁面?看不到這樣的按鈕單擊和導航與我們顯示的內容有什么關系嗎?為什么這兩個概念有聯系?我在這里看不到任何合理的邏輯?
如果您想放入一個窗格簡按鈕,甚至是一個鏈接按鈕(這里沒有區別),然后為您放入的給定按鈕連接一個單擊事件。
所以,比如說在我們的 GV 中,我們插入一個按鈕來查看給定的資料行。用酒店和按鈕說這個 GV。
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
CssClass="table table-hover" Width="50%"
DataKeyNames="ID" >
<Columns>
<asp:BoundField DataField="FirstName" HeaderText="FirstName" />
<asp:BoundField DataField="LastName" HeaderText="LastName" />
<asp:TemplateField HeaderText="Hotel Name">
<ItemTemplate>
<asp:Label ID="txtHotel" runat="server"
Text='<%# Eval("HotelName") %>' >
</asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Description" HeaderText="Description" />
<asp:TemplateField HeaderText="View">
<ItemTemplate>
<asp:Button ID="cmdView" runat="server" Text="View" CssClass="btn "
/>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<PagerStyle CssClass="pagenavi" />
</asp:GridView>
所以,我們只是放下了一個平面簡按鈕來進行那一行的操作。
所以,我們要加載的代碼是這樣的:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
LoadGrid()
End If
End Sub
Sub LoadGrid()
Using conn As New SqlConnection(My.Settings.TEST4)
Dim strSQL As String =
"SELECT * from tblHotelsA ORDER BY HotelName"
Using cmdSQL As New SqlCommand(strSQL, conn)
conn.Open()
Dim rst As New DataTable
rst.Load(cmdSQL.ExecuteReader)
GridView1.DataSource = rst
GridView1.DataBind()
End Using
End Using
End Sub
我們的結果現在是這樣的:

好的,現在讓我們連接飛機簡按鈕點擊。
通常,您可以雙擊一個按鈕來構建單擊事件,或者調出屬性表,選擇事件選項卡/部分,然后添加單擊事件。但是,由于按鈕在 GV 中,所以我們必須以這種方式(在標記中)添加點擊事件。
輸入 OnClick=,當你點擊“=”號時,intel-sense 會彈出一個對話框來創建事件。
你得到這個:

因此,我們選擇創建新事件。似乎沒有發生任何事情,但是翻到后面的代碼,我們有一個點擊事件存根,因此我們的代碼可以是這樣的:
Protected Sub cmdView_Click(sender As Object, e As EventArgs)
Dim btn As Button = sender
Dim gRow As GridViewRow = btn.Parent.Parent
Dim intPKID As Integer = GridView1.DataKeys(gRow.RowIndex).Item("ID")
Debug.Print("Row click index = " & gRow.RowIndex)
Debug.Print("Row click database PK id = " & intPKID)
' now do whatever you want with this row information.
' to get values from non templated columns, use cells()
' to get values from tempated columns, use findcontrol
'eg:
' get last name (Boundfield)
Debug.Print("Last name = " & gRow.Cells(1).Text)
' get hotel name - template - "label"
Dim lblHotel As Label = gRow.FindControl("txtHotel")
Debug.Print("Hotel name (label) = " & lblHotel.Text)
End Sub
輸出:

因此,如前所述,我看不出為什么在 GV 列中的某些資料為空時會出現任何問題?
在您的情況下,只需根據您想要的任何值單擊按鈕導航到您想要的任何內容。
像這樣說:
<asp:TemplateField HeaderText="View"> <asp:Button ID="cmdVi??ew" runat="server" Text="View" CssClass="btn " OnClick="cmdVi??ew_Click" CommandArgument = '<%# Eval("SO_ID" ) %>' /> </asp:TemplateField>
然后在后面的代碼中:
Protected Sub cmdView_Click(sender As Object, e As EventArgs)
Dim btn As Button = sender
Dim gRow As GridViewRow = btn.Parent.Parent
Dim intPKID As Integer = GridView1.DataKeys(gRow.RowIndex).Item("ID")
Debug.Print("Row click index = " & gRow.RowIndex)
Debug.Print("Row click database PK id = " & intPKID)
Dim intSOID = btn.CommandArgument
Dim strURLJumpTo = "../sales/order/view.aspx?ID=" & intSOID
Response.Redirect(strURLJumpTo)
因此,您可以隨意制作任何您想要的 URL 導航。
注意非常接近我如何使用 GV 的資料鍵功能。這使我可以擁有、使用、獲取、使用資料庫 PK 行 ID,但我永遠不必在實際 GV 標記中公開或顯示或擁有或弄亂資料庫 PK id。
這不僅很好,而且從安全的角度來看也是一筆巨大的交易,從那時起,用戶、瀏覽器(客戶端)就永遠不必看到、知道或可以玩弄或玩資料庫 PK 行 ID -它是 100% 服務器端管理的。
事實上,如果你的 SO_ID 或任何值不在 GV 中,或者用戶不在乎?然后我不會將 URL 中的值作為 URL 的所謂“查詢引數”傳遞,但實際上會像這樣傳遞 session() 中的值:
Session("OrderID") = intPKID
Response.Redirect("../sales/order/view.aspx")
然后在目標頁面的頁面加載事件中,我這樣做:
并且永遠不要忘記在頁面加載事件中檢查/使用 ispostback。
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
ViewState("OrderID") = Session("OrderID")
現在,在后面的代碼和那個頁面中,您使用它來獲取/使用/擁有 orederid
dim intOrderID = ViewState("OrderID")
因此,在頁面加載時(第一頁,ispostback = false),您將 session() 值傳輸到 ViewState。你這樣做是因為用戶可能有一個以上運行的瀏覽器副本 - 并且使用 session() 來傳遞值是可以的,但是 session() 對 ONE 用戶是全域的,其中 ViewState 是每頁。所以,這就是我們在頁面加載時轉移到 ViewState 的原因,因為從那個頁面開始,以及后面的代碼,我們使用 ViewState。如果我們在后面的代碼中使用了 session() ,那么它是全域的,并且如果瀏覽器的一個副本正在運行甚至多個表,它們都將具有相同的 session() 值。
那么,假設您單擊房屋查看或購買?
好吧,然后他們可能會打開另一個選項卡 - 顯示相同的 GV,然后單擊不同的行。如果我們使用會話,您現在會顯示兩個頁面 - 但兩者都具有同一行的 PK id 值 - 如果您單擊購買房子,如果您的代碼使用 session(),您會得到錯誤的房子,但使用 ViewState,問題不存在。
因此,您甚至可以將丑陋的“id”和引數從 URL 中轉出——它們看起來更好,但也更安全,因此用戶不必查看或了解諸如資料庫行 PK 之類的事情垃圾和東西。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/461162.html
標籤:网 VB.net 开发快递 aspxgridview
