1

所以,我的代码有点小问题。

我正在做一个小型学校项目(图书馆的娱乐),遇到了一个我无法掌握的问题。

因此,用户可以搜索书籍列表,并且在填充列表后(通过 DataList 控件),会出现一个小按钮“立即预订”(预订),用户可以单击该按钮并预订他的书。

这是位于“Search.aspx”中的 DataList 控件的代码

<asp:DataList ID="DataList1" runat="server" DataKeyField="knjigaId" DataSourceID="SearchSqlDataSource" CssClass="searchControl">
                <ItemTemplate>
                <div class="pictureOfFoundBook">
                    <asp:Image ID="pictureOfFoundBook_imageLink" runat="server" ImageUrl='<%#"~/GetImage.aspx?knjigaId=" & Eval("knjigaId") & "&img=naslovnica" %>' />
                </div>
                <div class="descriptionOfFoundBook">
                    Naziv: <asp:Label ID="Label1" runat="server" Text='<%# Eval("naziv") %>' /><br />
                    Godina izdanja: <asp:Label ID="Label2" runat="server" Text='<%# Eval("godinaIzdanja") %>' /><br />
                    Broj stranica : <asp:Label ID="brojStranicaLabel" runat="server" Text='<%# Eval("brojStranica") %>' /><br />
                    Izdava&#269;: <asp:Label ID="NazivIzdavacaLabel" runat="server" Text='<%# Eval("NazivIzdavaca") %>' /><br />
                    Vrsta tiskovine : <asp:Label ID="NazivVrsteTiskovineLabel" runat="server" Text='<%# Eval("NazivVrsteTiskovine") %>' /><br />
                    Kategorija: <asp:Label ID="NazivKategorijeLabel" runat="server" Text='<%# Eval("NazivKategorije") %>' /><br /><br />
                    <asp:HyperLink ID="foundBookEditHL_adminOnly" runat="server" NavigateUrl='<%# "~/admin/knjigeEdit.aspx?knjigaId=" & Eval("knjigaId") %>'>Uredi knjigu</asp:HyperLink><br />
                    <asp:Button ID="rezervacijeButton" runat="server" Text="Rezerviraj" OnClick="rezervacijaClick" CommandArgument='<%# Eval("knjigaId") %>'/><br />
                    <asp:Label ID="rezStatusLabel" runat="server"></asp:Label>
                    <asp:PlaceHolder ID="rezStatusPlaceholder" runat="server"></asp:PlaceHolder>
                </div>
                <hr />
                </ItemTemplate>
            </asp:DataList>

我已将 DataList1 控件设置为 Friend 子控件,因此我可以从另一个子控件访问其中的控件;

Friend Sub DataList1_ItemCreated(sender As Object, e As System.Web.UI.WebControls.DataListItemEventArgs) Handles DataList1.ItemCreated
    End Sub

我试图做以下事情;单击“rezervacijeButton”按钮后,会运行“rezervacijaClick”函数,该函数会填充数据库中的表。

Protected Sub rezervacijaClick(sender As Object, e As System.EventArgs)
            Dim Conn As New System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("LocalSqlServer").ToString)
            Dim cmd As New System.Data.SqlClient.SqlCommand
            Dim sql As New StringBuilder
            Dim rezstatus As Label = DataList1.FindControl("rezStatusLabel")

            sql.Append("INSERT INTO rezervacije(UserName, knjigaId) VALUES (@UserName, @knjigaId)")

            Dim buttonsender As Button = sender
            cmd.Parameters.AddWithValue("UserName", User.Identity.Name)
            cmd.Parameters.AddWithValue("knjigaId", buttonsender.CommandArgument)

            Conn.Open()
            cmd.CommandText = sql.ToString
            cmd.Connection = Conn
            cmd.ExecuteNonQuery()
            Conn.Close()

            buttonsender.Visible = False
            rezstatus.Text = "aaa"

            'Try
            '    rezstatus.Text = "testing..."
            'Catch ex As Exception
            '    exlabel.Text = "POGREŠKA"
            '    exlabel.ForeColor = Drawing.Color.Red
            'End 
        End Sub

我想要在函数“rezervacijaClick”中做的下一件事是在单击“保留”按钮后将标签的文本值(ID 为“rezStatusLabel”,位于 DataList1 控件内)设置为“SOME TEXT”。

但是单击按钮后,出现以下错误:

 Object reference not set to an instance of an object. 
Line 21: 
Line 22:         buttonsender.Visible = False
Line 23:         rezstatus.Text = "aaa"
Line 24: 
Line 25:         'Try
4

2 回答 2

1

你的rezstatus对象是Nothing( null)。

发生这种情况是因为您没有在正确的位置寻找您的标签。

您绑定到的每条数据记录都DataList将创建一个新的控件层次结构,这些容器包含您在ItemTemplate.

的直接后代DataList1将是DataListItem对象的集合,然后您将在其中拥有控件。

由于我们不确定(除非您知道您只将一条记录绑定到DataListDataListItem所需的标签将在其中,我们只需向后走控制树并从那里找到标签。

因为您正在响应rezervacijaClick方法中的按钮单击事件,所以参数sender将是 typeButton并且来自rezervacijeButton,因此我们可以使用该信息来查找您的标签:

Dim clickedButton As Button = CType(sender, Button) 'convert the sender parameter to the correct type: Button
Dim buttonParent As Control = clickedButton.Parent 'get a reference to the button's parent control
Dim rezstatus As Label = CType(buttonParent.FindControl(""), Label) 'find the label by ID and convert it to a Label as the return type of FindControl is Control
于 2013-10-03T13:48:14.750 回答
1

我建议您使用DataList.ItemCommand事件,而不是使用 Button click事件。它会让你的生活轻松很多。每当在 DataList 控件的一行中单击 Button 时,就会触发此事件。

这样,你就得到了通过DataListCommandEventArgs参数传入的索引。那么你只需要更新你的 DataList 标记来添加事件处理程序:

<asp:DataList ID="DataList1" runat="server" DataKeyField="knjigaId" 
    DataSourceID="SearchSqlDataSource" CssClass="searchControl"
    ItemCommand="DataList1_ItemCommand" >

您的处理程序代码如下所示:

Protected Sub DataList1_ItemCommand(sender As Object, e As System.EventArgs)
    Dim Conn As New System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("LocalSqlServer").ToString)
    Dim cmd As New System.Data.SqlClient.SqlCommand
    Dim sql As New StringBuilder

    Dim rezstatus As Label = e.Item.FindControl("rezStatusLabel")

    sql.Append("INSERT INTO rezervacije(UserName, knjigaId) VALUES (@UserName, @knjigaId)")

    Dim buttonsender As Button = e.Item.FindControl("rezervacijeButton")
    cmd.Parameters.AddWithValue("UserName", User.Identity.Name)
    cmd.Parameters.AddWithValue("knjigaId", buttonsender.CommandArgument)

    Conn.Open()
    cmd.CommandText = sql.ToString
    cmd.Connection = Conn
    cmd.ExecuteNonQuery()
    Conn.Close()

    buttonsender.Visible = False
    rezstatus.Text = "aaa"
End Sub
于 2013-10-03T14:05:08.650 回答