2017-10-18 122 views
0

我有我的網頁上的下列標記:刪除行的表

<asp:GridView ID="GridView" runat="server" 
     AutoGenerateDeleteButton="True" 
<Columns> 
    <asp:TemplateField HeaderText="ID" Visible="false"> 
      <ItemTemplate> 
       <asp:Label ID="lblID" runat="server" Text='<% #Eval("ID")%>'></asp:Label> 
      </ItemTemplate> 
    </asp:TemplateField> 
... 

我試圖獲取文本字段的值來獲得該行的正確的ID,我想刪除了,但我不知道如何準確地做到這一點,我曾嘗試下面的代碼:

Protected Sub GridView_RowDeleting(sender As Object, e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles GridView.RowDeleting 
    Dim row As GridViewRow = GridView.Rows(e.RowIndex) 
    Dim ID As Integer = TryCast(row.FindControl("lblID"), TextBox).Text 
... 

但是點擊刪除按鈕生成的網頁上後,我只是得到錯誤:

"Object reference not set to an instance of an object."

Visual Studio將錯誤指向「TryCast」。 我找不到任何類似的例子,不明白髮生了什麼,如果有人有更好的想法獲得該ID值也可以工作?

+0

這段代碼是絕對錯誤的:'TryCast(row.FindControl(「lblID」),TextBox).Text'。使用'TryCast'的重點在於它可能會失敗,你可能會得到'Nothing',所以直接訪問結果的成員是錯誤的。如果你知道演員陣容會成功,並且可以安全地訪問這樣的成員,那麼你應該使用'DirectCast',否則你應該首先測試TryCast的結果,並且只有在它不是'Nothing'時才使用它。 – jmcilhinney

回答

2

lblID一定的控制是通過這個控制標記定義標籤:

<asp:Label ID="lblID" runat="server" Text='<% #Eval("ID")%>'></asp:Label> 

在這條線,你想投的標籤控制爲TextBox,而不是Label,所以它返回Nothing和訪問Text時拋出NullReferenceException屬性:

Dim ID As Integer = TryCast(row.FindControl("lblID"), TextBox).Text 

你需要什麼被轉換爲Label並獲得Text特性有:

Dim ID As Integer = Convert.ToInt32(TryCast(row.FindControl("lblID"), Label).Text) 

注意Convert.ToInt32添加,因爲一個標籤控件的Text屬性包含字符串值,因此鑄造Integer是必要的。如果您不確定它會返回Nothing,請改爲使用Integer.TryParse

+0

非常感謝你,我只是沒有看到它。 – Dominik