C#/。Net 2.0:在用户控件内部时,Repeater控件和复选框出现问题!

时间:2008-12-19 10:36:43

标签: c# .net asp.net visual-studio-2005

我有一个带有复选框的转发器控件,如果我选中该复选框,那么我的删除功能将删除基础表中的项目。

当我在带有代码隐藏页面的aspx页面上测试删除功能时,一切正常。万岁!

但是,当我拿到转发器并将其放入用户控件时,删除功能会认为我的转发器控件没有任何项目。

代码如下,我试图删除不必要的代码。我在asp.net论坛上问过这个问题,但是没有人回复!

asxc:

<%@ Control  AutoEventWireup="true" Inherits="Moto.Web.UI.UserControls.Messages.MessageListForm" Language="C#" %>

<asp:button id="btnDelete" runat="server" text="Delete" OnClick="btnDelete_Click" ></asp:button>

<asp:Repeater ID="RepeaterMessageList"  runat="server" EnableViewState="true" >
    <ItemTemplate >
        <div class="messageContainer item" >
            <div class="messageListLeft">
                <div class="messageList">  
                    <asp:Image ID="imgUser" runat="server" CssClass="" />
                    <asp:CheckBox ID="chkDeleteMe" runat="server" Text="test" />
                </div>
            </div>
        </div>
    </ItemTemplate>

</asp:Repeater>

代码文件:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections;
using System.Collections.Generic;
using System.IO;

namespace Moto.Web.UI.UserControls.Messages
{
    public class MessageListForm : Moto.Web.UI.UserControls.UserControl//System.Web.UI.UserControl
    {
        private string userGUID;
        private MembershipUser MembershipUser;
        private Moto.Business.UserComponent userComponent;
        private Moto.Business.User user;
        private Button cmdPrev;
        private Button cmdNext;
        private Button cmdNewest;
        private Button cmdOldest;
        private Label lblCurrentPage;
        private Label lblMessage;
        private HyperLink hypPageRedirect;
        private Repeater RepeaterMessageList;
        private MessageView DisplayMessages = MessageView.Inbox;//default setting

        private Button btnDelete;
        private Label lblConfirmDelete;
        protected Button btnConfirmDelete;
        protected Button btnCancelDelete;

        enum MessageView
        {
            Inbox,  //0
            Sent    //1
        }

        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
            this.InitializePage();
        }

        protected void InitializePage()
        {
            this.cmdNext = (Button)FindControl("cmdNext");
            this.cmdPrev = (Button)FindControl("cmdPrev");
            this.cmdOldest = (Button)FindControl("cmdOldest");
            this.cmdNewest = (Button)FindControl("cmdNewest");
            this.lblCurrentPage = (Label)FindControl("lblCurrentPage");
 //           this.RepeaterMessageList = (Repeater)FindControl("RepeaterMessageList");

            this.RepeaterMessageList = (Repeater)FindControlRecursive(this, "RepeaterMessageList");


            this.hypPageRedirect = (HyperLink)FindControl("hypPageRedirect");
            this.lblMessage = (Label)FindControl("lblMessage");
            //delete functionality
            this.btnDelete = (Button)FindControl("btnDelete");
            this.lblConfirmDelete = (Label)FindControl("lblConfirmDelete");
            this.btnConfirmDelete = (Button)FindControl("btnConfirmDelete");
            this.btnCancelDelete = (Button)FindControl("btnCancelDelete");

            //where are we coming from - are we the Logged in user or just a voyeur?
            if (Page.User.Identity.IsAuthenticated)
            {
                this.userComponent = new Moto.Business.UserComponent();

                this.MembershipUser = Membership.GetUser();//user logged in
                this.userGUID = this.MembershipUser.ProviderUserKey.ToString();//signed in user
                this.user = this.userComponent.GetByUserGUID(this.userGUID);
            }
            else
            {
                Response.Redirect("~/default.aspx");
            }

            if (null != this.Page.Request.QueryString["viewing"])
            {
                //reset the enum value
                DisplayMessages = this.Page.Request.QueryString["viewing"].ToLower() == "sent" ? MessageView.Sent : MessageView.Inbox;
                CurrentPage = 0;//if it's a redirect then reset the Current Page
            }
        }

        void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ItemsGet();//on post back we'll call it elsewhere
            }

            switch (DisplayMessages)
            {
                case MessageView.Sent:
                    this.hypPageRedirect.Text += "Inbox";
                    this.hypPageRedirect.NavigateUrl += "?viewing=Inbox";
                    break;
                case MessageView.Inbox:
                    this.hypPageRedirect.Text += "Sent Items";
                    this.hypPageRedirect.NavigateUrl += "?viewing=Sent";
                    break;

            }
        }

        protected void cmdPrev_Click(object sender, EventArgs e)
        {
            // Set viewstate variable to the previous page
            CurrentPage -= 1;

            // Reload control
            ItemsGet();
        }

        protected void cmdNext_Click(object sender, EventArgs e)
        {
            // Set viewstate variable to the next page
            CurrentPage += 1;

            // Reload control
            ItemsGet();
        }

        protected void cmdNewest_Click(object sender, EventArgs e)
        {
            // Set viewstate variable to the previous page
            CurrentPage = 0;

            // Reload control
            ItemsGet();
        }

        protected void cmdOldest_Click(object sender, EventArgs e)
        {
        }

        public void RepeaterMessageList_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {

            // Execute the following logic for Items and Alternating Items.
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {

                //Are we vieing the Inbox or Sent items?
                if (DisplayMessages == MessageView.Inbox)
                {
                    .........Do stuff
                }
                else
                {
                    .........Do stuff
                }
            }
        }

        private void ItemsGet()
        {
//            this.RepeaterMessageList = (Repeater)FindControl("RepeaterMessageList");
            this.RepeaterMessageList.ItemDataBound += new RepeaterItemEventHandler(RepeaterMessageList_ItemDataBound);


            // Populate the repeater control with the Items DataSet
            PagedDataSource objPds = new PagedDataSource();

            if (DisplayMessages == MessageView.Inbox)//which table are we getting data from?
            {
                List<Moto.Business.MessageReceived> messages;
                Moto.Business.MessageReceivedComponent messageComponent =
                    new Moto.Business.MessageReceivedComponent();
                messages = messageComponent.GetByReceiverGUID(this.user.UserGUID);

                objPds.DataSource = messages;
            }
            else
            {
                List<Moto.Business.MessageSent> messages;
                Moto.Business.MessageSentComponent messageComponent =
                    new Moto.Business.MessageSentComponent();
                messages = messageComponent.GetBySenderGUID(this.user.UserGUID);

                objPds.DataSource = messages; //Items.Tables[0].DefaultView;
            }


            // Indicate that the data should be paged
            objPds.AllowPaging = true;

            // Set the number of items you wish to display per page
            objPds.PageSize = 25;

            // Set the PagedDataSource's current page
            objPds.CurrentPageIndex = CurrentPage;

            this.lblCurrentPage.Text = "Page " + (CurrentPage + 1).ToString() + " of "
                + objPds.PageCount.ToString();

            // Disable Prev or Next buttons if necessary
            this.cmdPrev.Enabled = !objPds.IsFirstPage;
            this.cmdNext.Enabled = !objPds.IsLastPage;
            this.cmdOldest.Enabled = !objPds.IsLastPage;
            this.cmdNewest.Enabled = !objPds.IsFirstPage;

            this.RepeaterMessageList.DataSource = objPds;
            this.RepeaterMessageList.DataBind();
        }

        public int CurrentPage
        {
            get
            {
                // look for current page in ViewState
                object o = this.ViewState["_messagesCurrentPage"];
                if (o == null)
                    return 0; // default page index of 0
                else
                    return (int)o;
            }

            set
            {
                this.ViewState["_messagesCurrentPage"] = value;
            }
        }
        protected void btnDelete_Click(object sender, EventArgs e)
        {

            foreach (RepeaterItem item in this.RepeaterMessageList.Items)
            {
                CheckBox chkDeleteMe = item.FindControl("chkDeleteMe") as CheckBox;
                TextBox test = item.FindControl("test") as TextBox;
                if (chkDeleteMe.Checked)
                {
                    if (DisplayMessages == MessageView.Inbox)//which table are we getting data from?
                    {
                    .........Do stuff

                    }
                    else
                    {
                    .........Do stuff

                    }
                }
            }          
            // Reload control
            ItemsGet();
        }

        protected Control FindControlRecursive(Control root, string id)
        {
            if (root.ID == id)
            {
                return root;
            }

            foreach (Control c in root.Controls)
            {
                Control t = FindControlRecursive(c, id);
                if (t != null)
                {
                    return t;
                }
            }
            return null;
        }

}

任何帮助都非常感谢!

5 个答案:

答案 0 :(得分:1)

我认为问题在于,当单击删除按钮时,会再次触发Page_Load,因为它的回发它不会执行ItemsGet方法,因此转发器没有数据。

尝试将ItemsGet方法调用放入OnPreRender事件而不是Page_Load。

Jomit

答案 1 :(得分:0)

所以它绑定到转发器并正确显示所有项目但是当重复通过回发项目列表时没有找到任何内容?

删除事件肯定会被触发吗?点击删除按钮后可见的是什么? (例如表格是空的还是仍显示所有项目)

更新

注释掉GetItems方法,并在回发时查看表是否为空。这听起来像你的转发器viewstate不会再次填充控件或其他东西。

答案 2 :(得分:0)

Delete事件会触发,但在for next ...循环中,转发器认为它没有任何项目。

循环后,然后调用Items Get()方法,该方法返回表中的所有数据。

答案 3 :(得分:0)

尝试将InitializePage()方法移动到另一个位置。我不知道为什么,但我有同样的问题,问题是当我尝试访问OnInit事件中的一些控件时。我转移到事件OnPreLoad()并且工作。

我希望能帮到你......

答案 4 :(得分:0)

PreRender解决方案也适用于我们的情况,我们在应用程序的两个页面中都有这样的代码。这在.Net 1.1中运行得很完美,但是当我们将此代码移植到.Net 2.0时就破裂了。

不确定为什么它在没有对代码库进行任何重大更改的情况下破解。

感谢OnPreRender提示!

-Ghanshyam