【问题标题】:Cannot refresh Listview after ItemCommand event is fired触发 ItemCommand 事件后无法刷新 Listview
【发布时间】:2012-12-19 08:27:45
【问题描述】:

我有一个允许编辑和删除的列表视图。 当我单击列表视图中的链接按钮时,它会启动 page_load 然后到 OnItemCommand。 在命令结束时,我添加了 DataBind,它不会刷新我的列表视图但删除了我的条目。 如果我将 DataBind 更改为使用 (...aspx?ID=...) 重定向回同一页面,它将返回一个全新的页面。但在调试模式下,我看到它通过 page_load 和 Databind 运行。

<asp:UpdatePanel ID="UpdateOptions" runat="server" >
    <ContentTemplate>
        <asp:Panel ID="OPanel" runat="server" width="350px">
            <asp:ListView runat="server" ID="lvPollOptions" DataKeyNames="POptionID" OnItemCommand="lvPollOptions_ItemCommand" OnDataBound="lvPollOptions_ItemDataBound" >
                <LayoutTemplate>
                    <table cellpadding="0" cellspacing="0" border="0" width="300px">
                        <tr class="AdminListHeader">
                        </tr>

                        <tr id="itemPlaceholder" runat="server">
                        </tr>

                    </table>
                </LayoutTemplate>

                <ItemTemplate>
                    <tr>
                        <td>
                            <%#Eval("OptionText")%>
                        </td>

                        <td>
                            <%#Eval("Votes")%>
                        </td>

                        <td align="center">
                            <asp:ImageButton runat="server" ID="ibtnEditOption" CommandArgument='<%# Eval("POptionID").ToString() %>' CommandName="Edit" ImageUrl="~/images/buttons/EditPencil.gif" AlternateText="Edit" CssClass="AdminImg" />
                        </td>

                        <td>
                            <asp:ImageButton runat="server" ID="ibtnDeleteOption" CommandArgument='<%# Eval("POptionID").ToString() %>' CommandName="Delete" ImageUrl="~/images/buttons/delete.gif" AlternateText="Delete" CssClass="AdminImg" OnClientClick="return confirm('Warning: This will delete the Poll Option from the database.');" />
                        </td>
                    </tr>
                </ItemTemplate>

            </asp:ListView>

            <asp:Label ID="lblNoOption" runat="server" Text="No Options Added"></asp:Label>

            <table width="345px">
                <tr>
                    <td width="100px">
                        Option:
                    </td>

                    <td>
                        <asp:TextBox ID="txtOption" runat="server" width="200px"></asp:TextBox>
                    </td>
                </tr>
            </table>
        </asp:Panel>
    </ContentTemplate>
</asp:UpdatePanel>

代码背后

protected void PollBindData()
{
    SqlConnection connOption = new SqlConnection(connStr);
    connOption.Open();
    SqlDataAdapter da = new SqlDataAdapter("SELECT POptionID, OptionText, Votes FROM [PollOptions] Where PollID = '" + PID + "'", connOption);
    DataSet dsSel = new DataSet();
    da.Fill(dsSel);
    lvPollOptions.DataSource = dsSel;
    lvPollOptions.DataBind();
    connOption.Close();
}

protected void Page_Load(object sender, EventArgs e)
{
    string PID = Request.QueryString["ID"];

    if (!IsPostBack)
    {
        if (PID == null)
        {

        }
        else if (PID != null)
        {
            PollBindData();
        }
    }
}

protected void lvPollOptions_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    string PID = Request.QueryString["ID"];

    SqlConnection connOption = new SqlConnection(connStr);
    connOption.Open();
    SqlDataAdapter da = new SqlDataAdapter("SELECT POptionID, OptionText, Votes      FROM [PollOptions] Where PollID = '" + PID + "'", connOption);
    DataSet dsSel = new DataSet();
    da.Fill(dsSel);
    lvPollOptions.DataSource = dsSel;
    lvPollOptions.DataBind();
    connOption.Close();
}

protected void lvPollOptions_ItemCommand(object sender, ListViewCommandEventArgs e)
{
    if (e.CommandName == "Delete")
    {
        string selectedID = e.CommandArgument.ToString();
        SqlConnection connDeleteOption = new SqlConnection(connStr);
        connDeleteOption.Open();
        SqlCommand cmdDeleteOption = new SqlCommand("DELETE FROM [PollOptions] WHERE POptionID = '" + selectedID + "'", connDeleteOption);
        cmdDeleteOption.ExecuteNonQuery();
        connDeleteOption.Close();

        PollBindData();
        //Response.Redirect("aAddEditPoll.aspx?ID=" + selectedID);
    }

    if (e.CommandName == "Edit")
    {
        string EditID = e.CommandArgument.ToString();
        SqlConnection conn = new SqlConnection(connStr);
        conn.Open();
        SqlCommand cmdView = new SqlCommand("SELECT OptionText From [PollOptions] Where POptionID = '" + EditID + "'", conn);
        SqlDataReader dr1 = cmdView.ExecuteReader();

        if (dr1.Read())
        {
            txtOption.Text = dr1["OptionText"].ToString();
        }

        Session["OptionID"] = txtOption.Text;
        dr1.Close();
        conn.Close();

        lbOInsert.Visible = false;
        lbOUpdate.Visible = true;

        PollBindData();
        //Response.Redirect("aAddEditPoll.aspx?ID=" + EditID);
    }
}

【问题讨论】:

    标签: c# asp.net listview webforms


    【解决方案1】:

    在我们开始之前 - 您的代码存在安全风险,因为它容易出现 Sql Injection,请确保您的查询是 Parametrize...

    现在,您的问题不是很清楚,但如果我理解正确,您是说删除对象后,回发后不会刷新 Listview(例如,您仍然看到已删除的项目)。由于您在 UpdatePanel 中运行,因此请确保在 DataBind 之后更新面板...

    像这样更新PoolBindData

    protected void PollBindData()
    {
        SqlConnection connOption = new SqlConnection(connStr);
        connOption.Open();
    
        // POTENTIAL SECURITY RISK - MAKE SURE YOU PARAMETRIZE THE QUERY!!
        SqlDataAdapter da = new SqlDataAdapter("SELECT POptionID, OptionText, Votes FROM [PollOptions] Where PollID = '" + PID + "'", connOption);
    
        DataTable dsSel = new DataTable();
        da.Fill(dsSel);
        lvPollOptions.DataSource = dsSel;
        lvPollOptions.DataBind();
        connOption.Close();
    
        // Update panel
        UpdateOptions.Update();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-13
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多