2

我试图向用户展示他们将要在 ListView 中插入的信息的预览。我有两个面板,我希望能够使用 ListView 的 InsertItemTemplate 中的按钮来显示和隐藏它们。

我下面的 ListView 代码用于说明目的。该函数是我正在使用的实际代码:

<asp:ListView ID="ListView1" runat="server">
    <InsertItemTemplate>

        <asp:Panel ID="pnlInsert" runat="server" Visible="true">
            <asp:Button ID="btnPreview" runat="server" OnClick="showPreview" Text="Preview" />
        </asp:Panel>

        <asp:Panel ID="pnlPreview" runat="server"  Visible="false">
            <p>This is the preview</p>
        </asp:Panel>

    </InsertItemTemplate>
</asp:ListView>


protected void showPreview(object sender, EventArgs e) 
{
    Panel pnlInsert = (Panel)ListView1.FindControl("pnlInsert");
    pnlInsert.Visible = false;
    Panel pnlPreview = (Panel)ListView1.FindControl("pnlPreview");
    pnlPreview.Visible = true;
}

我得到的错误是:

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

任何帮助将不胜感激。

4

3 回答 3

0

没有“pnlInsert”,有一个“面板 1”。

代替将控件投射到 Panels 我们使用as关键字。IE

Panel pnlInsert = e.FindControl("pnlInsert") as Panel;
if (pnlInsert != null)
{
    //do something with pnlInsert
}

ListView1.Parent.FindControl("pnlInsert")正在寻找 ListView 控件的父级,然后是 ListView 内部的控件。您的 pnlInsert 是 ListView 的子项。

根据您的其余代码,您可能只需要这样做:

protected void showPreview(object sender, EventArgs e) 
{
    pnlInsert.Visible = false;
    pnlPreview.Visible = true;
}
于 2012-07-05T11:24:35.383 回答
0

w 查看您的代码 面板位于名为 ListView1 的 ListView 内 w但您正在搜索 ListView1 的 Parent.Controls 内的面板

你需要的是 ListView1.FindControl("pnlInsert) & ListView1.FindControl("pnlPreview")

于 2012-07-05T11:18:07.460 回答
0

空引用异常是因为 pnlInsert 或 plnPreview 被赋值为空;可能是因为 FindControl 方法在 ListView1 中找不到“pnlInsert”或“pnlPreview”控件。

我还看到在 ListView1 中,第一个面板的 ID 是“Panel1”,所以你应该更改代码行

Panel pnlInsert = (Panel)ListView1.FindControl("pnlInsert");

Panel pnlInsert = (Panel)ListView1.FindControl("Panel1"); or

将标记中的面板 ID 更改为“pnlInsert”。

此外,建议在处理 FindControl 时使用防御性代码。将您的代码更改为以下

 Panel pnlInsert = ListView1.FindControl("pnlInsert") as Panel;

 if(pnlInsert != null)
 {
    pnlInsert.Visible = false;
 }
 else
 {
   // control not found - do something;
 }

 Panel pnlPreview = ListView1.FindControl("pnlPreview") as Panel;

 if(pnlPreview != null)
 {
   pnlPreview.Visible = true;
 }
 else
 {
   // control not found - do something;
 }
于 2012-07-05T11:36:21.897 回答