UpdatePanel, повторитель, проблема DataBinding

В пользовательском элементе управления у меня есть Повторитель в UpdatePanel (который идентификатор, отображенный в ModalPopupExtender. Повторитель связан с данными с помощью списка массива объектов MyDTO. Существует две кнопки для каждого Объекта в списке. После привязки ImageURL и CommandArgument установлены.

Этот код хорошо работает в первый раз вокруг, но CommandArgument неправ после этого. Кажется, что дисплей обновляется правильно, но DTO не, и отправленный CommandArgument является тем, который был просто удален.

Кто-либо может определить какие-либо проблемы с кодом?

Редактирование: я только что добавил CollapsiblePanelExtender к коду. Когда я теперь удаляю объект и разворачиваю панель, объект, который ранее удалили (и увели от дисплея) возвратился. Кажется, что Повторитель не был восстановлен правильно под шляпой.

ASCX

<asp:UpdatePanel ID="ViewDataDetail" runat="server" ChildrenAsTriggers="true">
    <Triggers>
        <asp:PostBackTrigger ControlID="ViewDataCloseButton" />
        <asp:AsyncPostBackTrigger ControlID="DataRepeater" />
    </Triggers>
    <ContentTemplate>
        <table width="100%" id="DataResults">
        <asp:Repeater ID="DataRepeater" runat="server" OnItemCommand="DataRepeater_ItemCommand" OnItemDataBound="DataRepeater_ItemDataBound">
        <HeaderTemplate>
            <tr>
            <th><b>Name</b></th>
            <th><b>&nbsp;</b></th>
            </tr>
        </HeaderTemplate>
            <ItemTemplate>
            <tr>
                <td>
                <b><%#((MyDTO)Container.DataItem).Name%></b>
                </td>
                <td>
                <asp:ImageButton CausesValidation="false" ID="DeleteData" CommandName="Delete" runat="server" />
                <asp:ImageButton CausesValidation="false" ID="RunData" CommandName="Run" runat="server" />
                </td>
            </tr>
            <tr>
                <td colspan="2">
                <table>
                    <tr>
                    <td>Description : </td>
                    <td><%#((MyDTO)Container.DataItem).Description%></td>
                    </tr>
                    <tr>
                    <td>Search Text : </td>
                    <td><%#((MyDTO)Container.DataItem).Text%></td>
                    </tr>
                </table>
                </td>
            </tr>
            </ItemTemplate>
        </asp:Repeater>
        </table>
    </ContentTemplate>
</asp:UpdatePanel>

Код - Позади

    public DeleteData DeleteDataDelegate;
    public RetrieveData PopulateDataDelegate;
    public delegate ArrayList RetrieveData();
    public delegate void DeleteData(String sData);


 protected void Page_Load(object sender, EventArgs e)
    {
        //load the initial data..
        if (!Page.IsPostBack)
        {
            if (PopulateDataDelegate != null)
            {
                this.DataRepeater.DataSource = this.PopulateDataDelegate();
                this.DataRepeater.DataBind();
            }
        }
    }

    protected void DataRepeater_ItemCommand(object source, RepeaterCommandEventArgs e)
    {
        if (e.CommandName == "Delete")
        {
            if (DeleteDataDelegate != null)
            {
                DeleteDataDelegate((String)e.CommandArgument);
                BindDataToRepeater();
            }
        }
        else if (e.CommandName == "Run")
        {
            String sRunning = (String)e.CommandArgument;
            this.ViewDataModalPopupExtender.Hide();
        }
    }

    protected void DataRepeater_ItemDataBound(object source, RepeaterItemEventArgs e)
    {
        RepeaterItem item = e.Item;
        if (item != null && item.DataItem != null)
        {
            MyDTO oQuery = (MyDTO)item.DataItem;

            ImageButton oDeleteControl = (ImageButton) item.FindControl("DeleteData");
            ImageButton oRunControl = (ImageButton)item.FindControl("RunData");

            if (oDeleteControl != null && oRunControl !=null)
            {
                oRunControl.ImageUrl = "button_expand.gif";
                oRunControl.CommandArgument = "MyID";
                if (oQuery !=null)
                { 
                  //do something
                }
                oDeleteControl.ImageUrl = "btn_remove.gif";
                oDeleteControl.CommandArgument = "MyID";
            }
        }
    }

    public void BindDataToRepeater()
    {
        this.DataRepeater.DataSource = this.PopulateDataDelegate();
        this.DataRepeater.DataBind();
    }

    public void ShowModal(object sender, EventArgs e)
    {
        BindDataToRepeater();
        this.ViewDataModalPopupExtender.Show();
    }
5
задан Gordon Thompson 10 June 2010 в 16:23
поделиться

2 ответа

Спасибо, что напомнили мне, почему я перестал использовать элементы управления ASP.NET. Это именно тот тип кошмара, из-за которого слишком много проектов выходят за рамки бюджета и графика.

Мой вам совет - подумайте о самом простом способе реализации. Вы можете попытаться извернуться, чтобы заставить это работать на ASP.NET, или пойти по кратчайшему пути. Все, что вы делаете, это генерируете HTML, это не должно быть так сложно.

Наиболее вероятной причиной вашей проблемы является то, что ViewState хранится на странице, которая не обновляется при частичном postback. Поэтому при каждом изменении в панели обновления вы будете возвращать исходное состояние страницы.

Попробуйте заменить повторитель простым циклом for (и не обращайте внимания на тех, кто начнет жаловаться, что нельзя смешивать разметку и код). Замените операторы привязки к базе данных на <%= %>. Это устранит состояние представления и избавит любой удаленный ряд от повторного появления.

7
ответ дан 14 December 2019 в 01:02
поделиться

После многих дней возни с этим я не нашел подходящего решения проблемы, но у меня есть работоспособное решение.

CollapsiblePanelExtender настроен на НЕ автоматическую обратную передачу, что устраняет проблему повторного появления удаленных данных при открытии расширителя. Другой вопрос, я думаю, связан с этим.

Похоже, что ViewState для ретранслятора не синхронизирован с данными. e.CommandArgument не всегда правильный и, кажется, ссылается на предыдущие данные.Я попытался исправить это, сохранив ArrayList объектов MyDTO в ViewState при открытии диалогового окна Modal и используя идентификатор, полученный из e.Item.ItemIndex, чтобы найти правильный элемент для удаления. Это не сработало правильно, ArrayList, извлеченный из ViewState, не синхронизировался.

Сохранение списка ArrayList в сеансе заставляет меня работать, что наводит меня на мысль, что я делаю что-то в корне неправильно или есть небольшая ошибка в версии инструментария, который я использую (мы все еще на VS2005 так что застряли на более старой версии инструментария)

Извините, если это не имеет смысла, свяжитесь со мной, если вам нужны разъяснения по чему-либо.

1
ответ дан 14 December 2019 в 01:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: