Кнопка «Отключить» на основе строки сетки - PullRequest
0 голосов
/ 05 января 2011

Привет, у меня есть элемент управления сеткой, где я связываю список наклеек. На сетке выше, то есть вне сетки, у меня есть две кнопки Создать стикер и Пустой стикер. Стикер в основном имеет три свойства Active, Void и Expired, отображаемые в виде текста в столбце. Существует условие добавления только одной наклейки за раз. Также, если есть активная наклейка, пользователь не может добавить другую наклейку до тех пор, пока не истечет срок ее действия или он не будет аннулирован.

Итак, я хочу, чтобы при загрузке моей сетки, если есть столбец с активным текстом, стикер создания / добавления отключается, а void включается. Я использую следующий код

  /// <summary>
/// Handles the RowDataBound event of the gvSticker control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.Web.UI.WebControls.GridViewRowEventArgs"/> instance containing the event data.</param>
/// <remarks></remarks>
protected void gvSticker_RowDataBound(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
{
    if (Session["FisherId"] != null)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            Label lblStatus = (Label)e.Row.FindControl("lblStickerStatus");

            if (lblStatus.Text.Contains("Active"))
        {
            btnAddSticker.Enabled = false;
            btnVoidSticker.Enabled = true;

                HyperLink hlStickerNum = (HyperLink)e.Row.FindControl("hlStickerNumber");
                hlStickerNum.Attributes.Add("style", 
                        "cursor:hand;text-decoration:underline;font-weight:bold;");
            if (!string.IsNullOrEmpty(hlStickerNum.Text.Trim()))
            {
            string urlWithParameters = "Stickers.aspx?StickerId=" 
                                     + hlStickerNum.Text;
                    hlStickerNum.Attributes.Add("OnClick", "popWinNote('" +
                                    urlWithParameters + "')");
                }

            }
            else
            {
                btnAddSticker.Enabled = true;
                btnVoidSticker.Enabled = false;
            }

        }
    }
    else
    {
        btnAddSticker.Enabled = true;
        btnVoidSticker.Enabled = false;
    }
}

Хорошо работает при первой загрузке сетки. Но терпит неудачу всякий раз, когда я изменяю индекс страницы сетки.

Обновление

Вот события привязки и обмена страницами

  /// <summary>
    /// Handles the PageIndexChanging event of the gvSticker control.
    /// </summary>
    /// <param name="sender">The source of the event.</param>
    /// <param name="e">The <see cref="System.Web.UI.WebControls.GridViewPageEventArgs"/> instance containing the event data.</param>
    /// <remarks></remarks>
    protected void gvSticker_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        gvSticker.PageIndex = e.NewPageIndex;
        BindStickerGrid();
    }



/// <summary>
        /// Binds the sticker grid.
        /// </summary>
        /// <param name="stickers">collection of  stickers.</param>
        /// <remarks></remarks>
        protected void BindStickerGrid()
        {
            if (Session["FisherId"] != null)
            {
                Collection<Sticker> _stickerCollection = _manager.GetStickerDetailsForGrid(Session["FisherId"].ToString(), "fisher");

                if (_stickerCollection != null)
                {
                    if (_stickerCollection.Count > 0)
                    {
                        gvSticker.DataSource = _stickerCollection;
                        gvSticker.DataBind();
                    }
                }
            }
        }

1 Ответ

0 голосов
/ 05 января 2011

Вы уверены, что событие RowDataBound срабатывает при каждой загрузке страницы?Я думаю, что элемент управления GridView может получить данные из ViewState при обратной передаче.

UPDATE

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

  1. В вашем обработчике событий RowDataBound подсчитайте количество активных стикеров (или просто используйте флаг, указывающий, был ли активный стикер найден на текущей странице).
  2. Подписаться на событие PreRender и переключить кнопки в соответствующее состояние в зависимости от того, сколько активных стикеров будет отображаться на текущей странице.

- Pavel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...