C # /. Net 2.0: проблема с элементом управления Repeater и флажками внутри пользовательского элемента управления! - PullRequest
1 голос
/ 19 декабря 2008

У меня есть элемент управления повторителем с флажком, если я установлю флажок, моя функция удаления удалит элемент в базовой таблице.

Когда я тестирую функцию удаления на странице 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 ]

1 голос
/ 29 декабря 2008

Я думаю, что проблема в том, что при нажатии кнопки удаления снова запускается Page_Load, и, поскольку он выполняет обратную передачу, он не выполняет метод ItemsGet и, следовательно, ретранслятор не имеет данных.

Попробуйте поместить вызов метода ItemsGet в событие OnPreRender вместо Page_Load.

Jomit

0 голосов
/ 13 февраля 2009

Решение PreRender также работало в нашем случае, когда у нас был такой код на двух страницах нашего приложения. Это прекрасно работало в .Net 1.1, но сломалось, когда мы портировали этот код на .Net 2.0.

Не уверен, почему он сломался без каких-либо серьезных изменений в кодовой базе.

Спасибо за совет OnPreRender!

-Ghanshyam

0 голосов
/ 19 декабря 2008

Событие Delete происходит, но в цикле fornext ... ретранслятор считает, что у него нет элементов.

После зацикливания он вызывает метод ItemsGet (), который возвращает все данные из таблицы.

0 голосов
/ 29 декабря 2008

Попробуйте переместить метод InitializePage () в другое место. Я не знаю почему, но у меня была та же проблема, и проблема была, когда я пытался получить доступ к некоторым элементам управления в событии OnInit. Я перешел на событие OnPreLoad () и работает.

Я надеюсь помочь вам ...

0 голосов
/ 19 декабря 2008

То есть он привязывается к повторителю и правильно отображает все элементы, но при повторении через список элементов на обратной передаче ничего не найдено?

Определенно ли происходит событие удаления? Что видно после нажатия кнопки «Удалить»? (например, таблица пуста или в ней все еще отображаются все элементы)

Обновление:

Закомментируйте метод GetItems и посмотрите, пуста ли таблица или нет при обратной передаче. Похоже, что состояние вашего повторителя больше не заполняет элемент управления или что-то в этом роде.

...