сохранение значений флажков в Gridview на подкачке asp.net/c# - PullRequest
0 голосов
/ 14 марта 2011

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

Это код в gridviewpage.aspx, который создает gridview:

 <form id="form1" runat="server">
    <div>
       <asp:GridView ID="GridView1" runat="server" 
        AutoGenerateColumns = "False" Font-Names = "Arial" 
        Font-Size = "11pt" AlternatingRowStyle-BackColor = "#C2D69B"  
        HeaderStyle-BackColor = "green" AllowPaging ="True"   
        OnPageIndexChanging = "OnPaging1xxx" OnRowDataBound = "RowDataBound" 
            AllowSorting="True" DataKeyNames="CustomerID" DataSourceID="SqlDataSource1" >
       <Columns>
        <asp:BoundField ItemStyle-Width = "150px" DataField = "CustomerID" 
               HeaderText = "CustomerID" ReadOnly="True" SortExpression="CustomerID" />
        <asp:BoundField ItemStyle-Width = "150px" DataField = "City" HeaderText = "City" 
               SortExpression="City"/>
        <asp:BoundField ItemStyle-Width = "150px" DataField = "Country" 
               HeaderText = "Country" SortExpression="Country"/>
        <asp:BoundField ItemStyle-Width = "150px" DataField = "PostalCode" 
               HeaderText = "PostalCode" SortExpression="PostalCode"/>
               <asp:TemplateField>
                <ItemTemplate>
                <asp:CheckBox id="CheckBox1" runat="server" onclick="Check_Click(this)"/>
                </ItemTemplate>
                <HeaderTemplate>
                <asp:CheckBox id="chkAll" runat="server" Text="Select All" onclick="checkAll(this)"/>
                </HeaderTemplate>
               </asp:TemplateField>
       </Columns> 
       <AlternatingRowStyle BackColor="#C2D69B"  />

<HeaderStyle BackColor="Green"></HeaderStyle>
    </asp:GridView> 
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ConnectionString="Data Source=SDANTURTHI-PC;Initial Catalog=ArticleDB;Integrated Security=True" 
            ProviderName="System.Data.SqlClient" 
            SelectCommand="SELECT [CustomerID], [City], [Country], [PostalCode] FROM [Customers]">
        </asp:SqlDataSource>
    </div>

Это код в gridviewpage.aspx.cs

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.Data.SqlClient;
using System.Collections;
using System.IO.Compression;  

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {        
        ArrayList CheckBoxArray;
        if (ViewState["CheckBoxArray"] != null)
        {
            CheckBoxArray = (ArrayList)ViewState["CheckBoxArray"];
        }
        else
        {
            CheckBoxArray = new ArrayList();
        }

        if (IsPostBack)
        {
            int CheckBoxIndex;
            bool CheckAllWasChecked=false;
            CheckBox chkAll = (CheckBox)GridView1.HeaderRow.Cells[4].FindControl("chkAll");
            string checkAllIndex = "chkAll-" + GridView1.PageIndex;
            if (chkAll.Checked)
            {                
                if (CheckBoxArray.IndexOf(checkAllIndex) == -1)
                {
                    CheckBoxArray.Add(checkAllIndex);
                }
            }
            else 
            {
                if (CheckBoxArray.IndexOf(checkAllIndex) != -1)
                {
                    CheckBoxArray.Remove(checkAllIndex);
                    CheckAllWasChecked = true;
                }
            }
            for (int i = 0; i < GridView1.Rows.Count; i++)
            {
                if (GridView1.Rows[i].RowType == DataControlRowType.DataRow)
                {
                    CheckBox chk = (CheckBox)GridView1.Rows[i].Cells[4].FindControl("CheckBox1");
                    CheckBoxIndex = GridView1.PageSize * GridView1.PageIndex + (i + 1);
                    if (chk.Checked)
                    {
                        if (CheckBoxArray.IndexOf(CheckBoxIndex) == -1 && !CheckAllWasChecked)
                        {
                            CheckBoxArray.Add(CheckBoxIndex);
                        }
                    }
                    else 
                    {
                        if (CheckBoxArray.IndexOf(CheckBoxIndex) != -1 || CheckAllWasChecked)
                        {
                            CheckBoxArray.Remove(CheckBoxIndex);
                        }
                    }
                }
            }
        }
       ViewState["CheckBoxArray"] = CheckBoxArray;

       GridView1.DataBind();
    }  

    protected void OnPaging1xxx(object sender, GridViewPageEventArgs e)
    {

        GridView1.PageIndex = e.NewPageIndex;
        GridView1.DataBind();
        if (ViewState["CheckBoxArray"] != null)
        {
            ArrayList CheckBoxArray = (ArrayList)ViewState["CheckBoxArray"];
            string checkAllIndex = "chkAll-" + GridView1.PageIndex;

            if (CheckBoxArray.IndexOf(checkAllIndex) != -1)
            {
                CheckBox chkAll = (CheckBox)GridView1.HeaderRow.Cells[4].FindControl("chkAll");
                chkAll.Checked = true;
            }
            for (int i = 0; i < GridView1.Rows.Count; i++)
            {

                if (GridView1.Rows[i].RowType == DataControlRowType.DataRow)
                {
                    if (CheckBoxArray.IndexOf(checkAllIndex) != -1)
                    {
                        CheckBox chk = (CheckBox)GridView1.Rows[i].Cells[4].FindControl("CheckBox1");
                        chk.Checked = true;
                        GridView1.Rows[i].Attributes.Add("style","background-color:aqua");      
                    }
                    else
                    {
                        int CheckBoxIndex = GridView1.PageSize * (GridView1.PageIndex) + (i + 1);
                        if (CheckBoxArray.IndexOf(CheckBoxIndex) != -1)
                        {
                            CheckBox chk = (CheckBox)GridView1.Rows[i].Cells[4].FindControl("CheckBox1");
                            chk.Checked = true;
                            GridView1.Rows[i].Attributes.Add("style", "background-color:aqua");
                        }
                    }
                }
            }
        }
    }
    protected void RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            e.Row.Attributes.Add("onmouseover", "MouseEvents(this, event)");
            e.Row.Attributes.Add("onmouseout", "MouseEvents(this, event)");
        }
    }
}

Невозможно сохранить значения, но когда я отлаживаю, checkboxarray и viewstate["checkboxarray"], похоже, обладают правильными значениями. Я не понимаю, почему это не работает. Пожалуйста, помогите мне. Спасибо в ожидании

1 Ответ

1 голос
/ 14 марта 2011

Обратите внимание, что ViewState только «работает» при поездке с сервера в браузер. Вы не можете ожидать, что это все еще будет там на посте назад.

Сохранение этого требует использования сеанса.

EDIT

Все, что вы хотите вернуть на сервер, нужно указать в виде
-> Это будет в Request.Form ["blabla"]
или в строке запроса (mypage.aspx? blabla = somevalue)
-> Это будет в Request.QueryString ["blabla"]

Это единственный способ получить данные с сервера на вашу страницу.

(Добавление:

Это немного скрыто от вас, когда ваши элементы управления вызывают события, которые вы обрабатываете в своем файле cs-кода. ASP.NET оборачивает элементы управления в форму и отправляет сообщение обратно -> вы запускаете код -> обновленная страница отправляется обратно)

EDIT

Ваши флажки находятся в Request.Form [..] как "CheckBox1xxx" с xxx, являющимся номером строки. Этот номер строки будет для вас относительно бессмысленным.

Я рекомендую просмотреть значения в Request.Form и посмотреть, какие из них начинаются с «CheckBox1» (например, здесь ), извлечь номер строки, получить значение для «CustomerIDxxx» и использовать его. чтобы соответствовать с правильной записью.

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