Как сохранить состояние элемента управления в виде сетки, для которого включена подкачка? - PullRequest
1 голос
/ 28 июня 2011

У меня есть вид сетки из 4 столбцов, включая столбец «Утвердить».Утверждение имеет флажок, который будет повторяться для всех строк набора данных после привязки.Я установил allowpaging = true & pageindexsize равным 10. Теперь предположим, что я установил флажки для строк 2 и 5, перешел на страницу 2 и вернулся на страницу 1, флажки, которые я установил (для строк 2 и 5) настраница 1 возвращается в непроверенное состояние.Я знаю причину, что это связано с привязкой вида сетки, который мы делаем на событии onpageindexchangeing.Но есть ли способ сохранить состояние флажка, даже если мы переходим с 1 страницы на другую.

Спасибо

Ответы [ 4 ]

1 голос
/ 28 июня 2011

Вы можете использовать Session для поддержания значений. Одно событие изменения индекса страницы, вам нужно добавить значения в сеанс и заново привязать флажки.

Вот несколько ссылок, которые могут вам помочь

  1. http://forums.asp.net/p/1368550/2852029.aspx
  2. http://myaspsnippets.blogspot.com/2010/08/maintaining-state-of-checkboxes-while.html
0 голосов
/ 30 марта 2017

Я попробовал методы PreRender от @Chuck, но у меня это не сработало (VS2005, ASP.net2, SQLsrv2005).Возможно, слишком старая технология, но это то, что есть у клиента.

Поэтому я попробовал простую технику myaspsnippets , и с некоторыми модификациями она отлично работает!

My Gridview

                <asp:GridView ID="gvFTUNSENT" runat="server" 
                    AutoGenerateColumns="False" CellPadding="4" ForeColor="Black" AllowSorting="False" CssClass="gvCSS" Width="100%"
                    DataKeyNames="StudentID,StudentUnitID" DataSourceID="sdsFTUNSENT" 
                    GridLines="None" AllowPaging="True" PageSize="10" BackColor="White" BorderColor="#DEDFDE" BorderStyle="None" BorderWidth="1px" 
                    OnPageIndexChanged="GridView_PageIndexChanged" 
                    OnPageIndexChanging="GridView_PageIndexChanging">
                    <RowStyle Wrap="True" Height="48px" />
                    <Columns>
...etc...
                    </Columns>
                    <FooterStyle BackColor="#6B696B" Font-Bold="True" ForeColor="White" Height="100%" />
                    <PagerStyle CssClass="cssPager" BackColor="#6B696B" ForeColor="White" HorizontalAlign="Left" Height="100%" />
                    <HeaderStyle BackColor="#6B696B" Font-Bold="True" ForeColor="White" />
                </asp:GridView>

Используемые мной методы Pageing:

protected void GridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    GridView gv = (GridView)sender;

    //saves a "copy" of the page before it's changed over to the next one
    SavePageState(gv);

    gv.PageIndex = e.NewPageIndex;
    gv.DataBind();
}

и

    protected void GridView_PageIndexChanged(object sender, EventArgs e)
    {
...your code to handle anything after the page has changed

                    gv.DataSource = dt;
                    gv.DataSourceID = null;
                    gv.DataBind();

                    //reload any checkboxes that were session saved in the page
                    LoadPageState(gv);
                }
            }
        }
    }

Итак, методы SAVE и LOAD следующие:

private void SavePageState(GridView gv)
{
    ArrayList categoryIDList = new ArrayList();
    Int32 index = -1;
    foreach (GridViewRow row in gv.Rows)
    {
        HiddenField hfStudentUnitID = (HiddenField)row.FindControl("hfStudentUnitID");
        if (hfStudentUnitID != null)
        {
            if (hfStudentUnitID.Value.Length > 0)
            {
                index = Convert.ToInt32(hfStudentUnitID.Value.ToString()); //gv.DataKeys[row.RowIndex]["StudentUnitID"];
                bool result = ((CheckBox)row.FindControl("cbSEND")).Checked;

                // Check in the Session
                if (Session["CHECKED_ITEMS"] != null)
                    categoryIDList = (ArrayList)Session["CHECKED_ITEMS"];
                if (result)
                {
                    if (!categoryIDList.Contains(index))
                        categoryIDList.Add(index);
                }
                else
                    categoryIDList.Remove(index);
            }
        }
    }
    if (categoryIDList != null && categoryIDList.Count > 0)
        Session["CHECKED_ITEMS"] = categoryIDList;
}

И

private void LoadPageState(GridView gv)
{
    ArrayList categoryIDList = (ArrayList)Session["CHECKED_ITEMS"];
    if (categoryIDList != null && categoryIDList.Count > 0)
    {
        foreach (GridViewRow row in gv.Rows)
        {
            HiddenField hfStudentUnitID = (HiddenField)row.FindControl("hfStudentUnitID");
            if (hfStudentUnitID != null)
            {
                if (hfStudentUnitID.Value.Length > 0)
                {
                    Int32 index = Convert.ToInt32(hfStudentUnitID.Value.ToString()); //gv.DataKeys[row.RowIndex]["StudentUnitID"];
                    if (categoryIDList.Contains(index))
                    {
                        CheckBox myCheckBox = (CheckBox)row.FindControl("cbSEND");
                        myCheckBox.Checked = true;
                    }
                }
            }
        }
    }
}

Чтобы это сработало, вам нужно поместить вызовы метода Paging в ваш GridView, изменить идентификатор CheckBox с cbSEND на то, что вы используете, и указатьHiddenFields для некоторого другого элемента управления или значения, которое имеет уникальный идентификатор для ваших строк. Не используйте RowIndex, так как это не уникально по всей длине данных в GridView.

Работает как шарм!

0 голосов
/ 13 ноября 2013

Другой подход:

Создайте свойство bool для вашего привязываемого объекта с именем «userSelected» (или аналогичным) Создайте индексатор по идентификатору объекта в вашем объекте связываемого списка В grid_RowDataBound добавьте идентификатор привязываемого объекта в качестве атрибута к флажку На grid_RowDataBound также установите свойство флажка вашего флажка в obj.userSelected На chech_CheckChaged используйте свой индексатор, чтобы установить свойство userSelected вашего привязываемого объекта

Спасибо

0 голосов
/ 28 июня 2011

Try, (Вам нужно установить два события Checkbox_Checked и Checkbox_PreRender для элемента управления CheckBox в сетке. Также в сетке должен быть установлен DataKey, чтобы в массиве Checks был индекс

protected bool[] Checks
{
    get { return (bool[])(ViewState["Checks"] ?? new bool[totalLengthOfDataSource]); }
    set { ViewState["Checks"] = value; }
}

protected void Checkbox_Checked(object sender, EventArgs e)
{
    CheckBox cb = (CheckBox)sender;
    bool[] checks = Checks;
    checks[(int)GetRowDataKeyValue(sender)] = cb.Checked;
    Checks = checks;
}

protected void Checkbox_PreRender(object sender, EventArgs e)
{
    CheckBox cb = (CheckBox)sender;
    bool[] checks = Checks;
    cb.Checked = checks[(int)GetRowDataKeyValue(sender)];
}

Они лучше всего работают в статическом классе GridViewUtils.

public static GridViewRow GetRow(object sender)
{
    Control c = (Control)sender;
    while ((null != c) && !(c is GridViewRow))
        c = c.NamingContainer;
    return (GridViewRow)c;
}

/// <summary>
/// Get the Grid the row is in
/// </summary>
/// <param name="row"></param>
/// <returns></returns>
public static GridView GetGrid(this GridViewRow row)
{
    Control c = (Control)row;
    while ((null != c) && !(c is GridView))
        c = c.NamingContainer;
    return (GridView)c;
}

/// <summary>
/// Get the ID field value based on DataKey and row's index
/// </summary>
/// <param name="sender">Any web-control object in the grid view</param>
/// <returns></returns>
public static object GetRowDataKeyValue(object sender)
{
    try
    {
        GridViewRow row = GetRow(sender);
        GridView grid = row.GetGrid();
        return grid.DataKeys[row.RowIndex].Value;
    }
    catch
    {
        return null;
    }
}
...