Как мне запустить постбэк обновления панели с дочерней страницы? - PullRequest
2 голосов
/ 22 октября 2009

У меня есть панель обновления в ячейке для каждой строки в виде сетки. Пользователь нажимает кнопку ссылки на этой панели обновлений, чтобы отобразить (используя window.open ()) всплывающее окно. В этом всплывающем окне выполняется действие, которое обновляет данные, содержащиеся в вышеупомянутой панели обновления. Я хочу вызвать обновление только для этой панели обновлений, когда всплывающее окно закрыто.

Каков наилучший способ сделать это? Я исследую захват события window.close и как-то передаю значение, указывающее, откуда было вызвано всплывающее окно, а затем вызываю обратную передачу для этой панели обновления в JavaScript. Если это имеет значение (по крайней мере, это будет - тьфу - в моем коде javascript), я использую главную страницу и пишу только для IE.

Нашел это: http://forums.asp.net/p/1166328/1941797.aspx, который использует window.opener.document ... Опять же, использование главной страницы усложняет ситуацию.

Ответы [ 6 ]

1 голос
/ 12 января 2010

Вы можете использовать функцию javascript __doPostBack ('eventTarget', 'eventArgument'). На стороне клиента, возможно, выглядит так.

function showPopup()
{
 var return = window.showModalDialog('someurl','','');
 if(return)
 {
  // do postback for update
  __doPostBack('<%= hiddenButton.ClientID %>','eventArgument');
 }
}

на стороне сервера вы должны использовать панель обновления с UpdateMode = Conditional и скрытой кнопкой, как говорит Рик Шотт. Самое сложное - это узнать, какую ячейку нужно обновить. Если вы подключили OnClick для скрытой кнопки, то это событие сработает при вызове __doPostBack. Вы можете получить доступ к Request.Form ["__EVENTARGUMENT"] со стороны сервера, чтобы получить доступ к значению, которое отправил __doPostBack. Вы можете поиграть с этим значением, например, какую ячейку нужно обновить.

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

Я оставил свои попытки сделать это в отдельном окне и разработал решение вместо этого, используя AJAX ModalPopupExtender. пример Мэтта Берсета был очень полезным.

Чтобы обновить дочернюю сетку, содержащуюся на панели обновления в родительской сетке, я сохранил значение строки, из которой была нажата кнопка, в переменной сеанса, а затем использовал это значение, которое называется методом привязки данных дочерней сетки, Пользователь сделал свой выбор и нажал "Сохранить".

protected void btnShowSkillsetPopup_Click(object sender, EventArgs e)
{
    // get the gridviewrow from the sender so we can get the datakey we need
    Button btnAddSkillsetsFromRow = sender as Button;
    GridViewRow row = (GridViewRow)btnAddSkillsetsFromRow.NamingContainer;

    Session["CapRes_ResourceRequestID"] = Convert.ToString(this.grdResources.DataKeys[row.RowIndex].Value);
    Session["CapRes_SkillsetUpdatePanel_Row"] = Convert.ToString(row.RowIndex);
    ModalPopupExtender.Show();
}

Сохранить код ...

int nUpdatePanelID = Convert.ToInt32(Session["CapRes_SkillsetUpdatePanel_Row"].ToString());
UpdatePanel pnlSkillsetsMain = grdResources.Rows[nUpdatePanelID].FindControl("pnlSkillsetsMain") as UpdatePanel;
GridView grdSkillsets = pnlSkillsetsMain.Controls[0].FindControl("CascadingSkillsets1").FindControl("grdSkillsets") as GridView;
grdSkillsets.DataBind();

ModalPopupExtender.Hide();
0 голосов
/ 15 декабря 2009

У меня оба эти способа работают

(1) С помощью ссылки на ChildPage из MasterPAge

    ContentPlaceHolder_content.FindControl("dvwOrder").Controls.Clear();
    ((UpdatePanel)this.ContentPlaceHolder_content.FindControl("upOrders")).Update();

Этот код находится внутри мастер-страницы, и при нажатии моей кнопки я использую заполнитель содержимого, чтобы найти ссылку для управления внутри него. Здесь dvwOrder - это мой DataView, а «upOrders» - мой UpdatePanel.

(2) через делегатов

Поместите этот делегат и обработчик событий на мастер-страницу вне любого метода

    public delegate void RefreshButtonClickHandler(object

отправитель, EventArgs e); публичное событие RefreshButtonClickHandler onRefreshButtonClick;

внутри класса в вашем событии нажатия кнопки сделайте это

        if(null == onRefreshButtonClick)
        {
            return;                
        }

        onRefreshButtonClick(sender, e);

Затем метод Page_Load страницы потомков связывает это событие с локальным обработчиком

        Child child = (child) this.Master;
        reports.onRefreshButtonClick += new

Дети .RefreshButtonClickHandler (reports_onRefreshButtonClick);

Здесь Child - имя моего кода за файлом

создать

    void child_onRefreshButtonClick(object sender, EventArgs e)
    {

    }

и все готово

0 голосов
/ 01 декабря 2009

Более простое (и работающее) решение, которое я выбрал, заключалось в реализации этого с использованием ModalPopupExtender в пользовательском элементе управления в ячейке gridview. Пользовательский элемент управления содержит таблицу результатов только для чтения и ModalPopupExtender. Всплывающее окно позволяет редактировать содержимое этой сетки в ячейке родительской сетки. После нажатия кнопки «Добавить» мини-сетка обновляется асинхронно.

Несколько ключевых моментов, которые наконец-то привели меня в рабочее решение ...

  • Обернуть содержимое панели, на которую ссылается свойство PopupControlId, на панели обновления
  • Скрыть и показать модальное всплывающее окно в коде
  • Простой и хороший пример вида сетки с использованием нескольких ModalPopupExtenders
0 голосов
/ 11 ноября 2009

Вы можете использовать скрытые поля на странице вызова для хранения любых значений, необходимых для вашего обратного вызова. Всплывающее окно может использовать window.opener для хранения значений в этих скрытых полях.

Вы можете расширить функцию window.open, чтобы обновить переменную javascript на странице со ссылкой на вызывающего:

<asp:button onclientclick="buttonClicked(this)" />

var lastButton;
function buttonClicked(button) {
lastButton = button;
window.open(x);
return false;
}

Если вы сделаете скрытые поля управления asp, то у вас будет доступ к ним на обратной стороне панели обновления.

Edit:

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

0 голосов
/ 23 октября 2009

Я сделал это из приложения Flash. Мой "хак", если хотите, был спрятать настоящий ASP: Button с CSS. Кнопка была внутри панели обновления. Я передал Button.ClientId внешнему ресурсу (Flash, новое окно ... и т. Д.). Когда внешний ресурс (в моем случае Flash) завершается, он вызывает функцию JavaScript, которая принимает ClientId и вызывает кнопку .Click () для кнопки.

JavaScript:

function CallASPNETClick(id) {  
    var elmt = document.getElementById(id);   
    elmt.click();

}

Markup:

!--this is uses for capture an event from Flash with javascript, do not remove--->
<asp:Button ID="hiddenButton" runat="server" Text="Button" style="visibility:hidden" OnClick="hiddenButton_Click" />
...