当前上下文中不存在Repeater中的删除按钮

时间:2017-06-26 10:03:17

标签: c# asp.net repeater

===================

更新:29/06/2017

我试图让我的转发器控件中的删除按钮按预期运行。目的是让按钮“激活”我的MSSQL数据库中的存储过程。

我要感谢Win的深度回应,尽管我仍在努力解决这个问题。我接受我可能无法在第一时间正确地表达我的问题。因此我编辑了我的帖子以显示我现在的代码。我相信我即将破解这个问题,并真诚地感谢任何协助。

我的*。* aspx页面中的代码:

<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ 
ConnectionStrings:ConnectionString %>" SelectCommand="SELECT * FROM 
[Comments] WHERE ([Ad_ID] = @Ad_ID) ORDER BY [CommentCreationDateTime] ASC">

进一步向下*。* aspx页面:

<asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource2" 
Visible="True" OnItemCommand="Repeater1_ItemCommand">
<HeaderTemplate></HeaderTemplate>
<ItemTemplate>
<table id="displayCommentsTable" class="displayCommentsTable">
<tr class="displayCommentsTable"><td class="displayCommentsTable">
<asp:ImageButton ID="deleteCommentImageButtonReal" runat="server" 
class="rightCross" ImageUrl="images/Red-Cross-Mark-PNG.png" 
OnClientClick="return confirm('Are you sure you wish to delete this 
comment?');" Height="11" Width="11" CommandName="Delete" 
CommandArgument='<%# Eval("Comment_ID") %>' /><%# Eval("CommenterName") %> 
commented on <%# Eval("CommentCreationDateTime", "{0:d/M/yyyy <i> hh:mm:ss 
tt}") %>
</td></tr>
<tr class="displayCommentsTable"><td class="displayCommentsTable"><%# 
Eval("CommentText") %><br /></td></tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>

最后,我的代码背后的魔法应该发生但不是:

protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
{
if (e.CommandName == "Delete")
{
DeleteCommentById(Convert.ToInt32(e.CommandArgument))
}
}
private void DeleteCommentById(int Comment_ID)
{
SqlConnection conn;
SqlCommand deleteCommentById;

string connectionString = 
ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;

conn = new SqlConnection(connectionString);

deleteCommentById = new SqlCommand("usp_deleteCommentById", conn);

deleteCommentById.CommandType = System.Data.CommandType.StoredProcedure;

deleteCommentById.Parameters.Add("@Comment_ID", System.Data.SqlDbType.Int);
deleteCommentById.Parameters["@Comment_ID"].Value = Comment_ID;

conn.Open();

deleteCommentById.ExecuteNonQuery();

conn.Close();
}

或许值得一提的是,如果我“硬编码”我试图删除的行,那么它就可以了。例如,如果我在删除按钮中使用了以下内容:

CommandArgument='44'

然后存储过程将触发并按预期影响线44。

3 个答案:

答案 0 :(得分:1)

最简单的方法是使用ItemCommand事件。

enter image description here

<%@ Page Language="C#" AutoEventWireup="true" 
     CodeBehind="RepeaterDemo.aspx.cs" Inherits="DemoWebForm.RepeaterDemo" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:Repeater ID="Repeater1" OnItemCommand="Repeater1_ItemCommand" runat="server">
            <ItemTemplate>
                <p>
                    <%#Eval("Name") %>
                    <asp:ImageButton CommandArgument='<%# Eval("Id") %>' runat="server"
                        ImageUrl="~/Images/Delete.png" CommandName="Delete" />
                </p>
            </ItemTemplate>
        </asp:Repeater>
    </form>
</body>
</html>

代码背后

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace DemoWebForm
{
    public partial class RepeaterDemo : System.Web.UI.Page
    {
        public class Comment
        {
            public int Id { get; set; }
            public string Name { get; set; }
        }

        public static IList<Comment> Comments = new List<Comment>
        {
            new Comment {Id = 1, Name = "One"},
            new Comment {Id = 2, Name = "Two"},
            new Comment {Id = 3, Name = "Three"}
        };

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Repeater1.DataSource = Comments;
                Repeater1.DataBind();
            }
        }

        protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
        {
            if (e.CommandName == "Delete")
            {
                int id = Convert.ToInt32(e.CommandArgument);
                var comment = Comments.FirstOrDefault(c => c.Id == id);
                Comments.Remove(comment);

                Repeater1.DataSource = Comments;
                Repeater1.DataBind();
            }
        }
    }
}

答案 1 :(得分:0)

您在什么情况下尝试访问转发器按钮?

您需要尝试在转发器项目中找到控件。 例如:     按钮btn1 =(按钮)rptItem.FindControl(“btn1”);

答案 2 :(得分:-1)

一切都运行正常,但由于我没有指定只返回未被软删除的结果,所有内容都被返回。 Noob错误,为未来学到了一些东西!