Извлечение всех объектов GridViewRow из элемента управления GridView с включенной подкачкой - PullRequest
0 голосов
/ 22 апреля 2009

У меня в настоящее время есть элемент управления GridView на моей странице aspx с включенной подкачкой страниц, и мне нужно перебрать всю коллекцию строк / количество для обработки выбранных записей. С моим текущим кодом, он будет проходить только по текущей странице строки GridView.

Как лучше всего выполнить эту задачу?

Вот мой текущий код:

Страница ASPX:

<asp:GridView ID="MyGridView" runat="server" AllowPaging="true" PageSize="20">
   <Columns>
      <!-- My Column list -->
   </Columns>
</asp:GridView>
<asp:Button id="MyButton" runat="server" Text="Add" OnClick="MyButton_Click" />  

код позади:

protected void MyButton_Click(object sender, EventArgs e)
{
    for (int Count = 0; Count < MyGridView.Rows.Count; Count++)
    {
        //The row count is 20 and only contains the GridViewRow object in the current page view  
        //I want to retrieve the all GridViews rows so I can add them to a ReorderList control
    }   
}

Ответы [ 5 ]

3 голосов
/ 22 апреля 2009

Да, потому что ваш пользовательский интерфейс gridview знает только о текущей странице. Получить источник данных и определить количество строк оттуда ...

        int count = ((DataTable)MyGridView.DataSource).Rows.Count;

// или

        int count = ((ICollection<SomeRecord>)MyGridView.DataSource).Count;
3 голосов
/ 09 ноября 2011

Просто используйте следующий код:

//Change gridview to
GridView1.AllowPaging = false;
GridView1.DataBind();

 //Transfer rows from GridView to table
for (int i = 0; i < GridView1.Rows.Count; i++)
{
    if (GridView1.Rows[i].RowType == DataControlRowType.DataRow)
    {
        for (int j = 0; j < GridView1.Rows[0].Cells.Count; j++)
        {
              //Add your code here..
        }
    }
}

//After filling your datatable change gridview paging style back to first, ie.

GridView1.AllowPaging = true;
GridView1.DataBind();

Это может помочь вам, дайте мне знать, если это было полезно для вас ...

1 голос
/ 22 апреля 2009

Я думаю, вы должны получить количество строк из числа строк вашего источника данных.

Если вам нужно отфильтровать строки, вы можете использовать DataTable / DataView's Выбрать метод.

РЕДАКТИРОВАТЬ: Вы не можете получить фактическое количество строк по gridview.Rows.Count, если просмотр сетки выполняется на странице. В зависимости от вашего комментария, я предполагаю, что вы используете общий список listDataSource для привязки вашего вида сетки, вы можете получить количество строк как:

List<DataSourceItem> selectedRows = 
  listDataSource.FindAll(delegate(DataSourceItem item)
  {
      // Assuming you have a IsSelected bool property 
      // that refers your row is selected : 
      return item.IsSelected;
  });
  int rowCount = selectedRows.Count;
0 голосов
/ 03 апреля 2017

@ Ответ CRice должен был быть официальным ответом.

Вот мое решение. Вам необходимо предварительно сохранить данные вида сетки через DataSource в ViewState или Session.

GridView.Rows относится только к «видимым» строкам или странице, отображаемой в данный момент на экране.

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

        DataSourceSelectArguments dss = new DataSourceSelectArguments();

    //get the datasource related to the gridview
    string wsDataSourceID = (gv.DataSourceID == string.Empty) ? ViewState["DataSourceID"].ToString() : gv.DataSourceID;
    SqlDataSource sds = (SqlDataSource)pnlMAIN.FindControl(wsDataSourceID);
    if (sds != null)
    {
        //load the data again but this time into a dataview object
        DataView dv = (DataView)sds.Select(DataSourceSelectArguments.Empty);
        if (dv != null)
        {
            //convert the dataview to a datatable so we can see the row(s)
            DataTable dt = (DataTable)dv.ToTable();
            if (dt != null)
            {
                //Save your data before changing pages
                ViewState["AllTheData"] = dt;

                gv.DataSource = dt;
                gv.DataSourceID = null;
            }
        }
    }

    //now change pages!
        gv.PageIndex = e.NewPageIndex;
        gv.DataBind();
    }

Далее, при смене страниц, здесь мы сохраняем данные

protected void GridView_PageIndexChanged(object sender, EventArgs e)
{
    GridView gv = (GridView)sender;

    DataSourceSelectArguments dss = new DataSourceSelectArguments();

    //reload the datatable back to the gridview
    gv.DataSource = ViewState["AllTheData"];
    gv.DataSourceID = null;
    gv.DataBind();

Надеюсь, код говорит сам за себя.

Спасибо

0 голосов
/ 01 февраля 2013

использовать сессию или состояние для хранения:

protected void Set_CheckboxStatus()
    {
        CheckBox selectall = (CheckBox)EmployeeGrid.HeaderRow.FindControl("gcb_selectall");
        ArrayList cbstatuslist = new ArrayList();
        if (Session["childcbstatus"] != null)
        {
            cbstatuslist = (ArrayList)Session["childcbstatus"];
        }
        foreach (GridViewRow row in EmployeeGrid.Rows)
        {
            int cb_index = (int)row.DataItemIndex;  //For Getting DataItemIndex of EmployeeGrid 
            //int cb_index = (int)row.RowIndex;
            CheckBox cb_selemp = (CheckBox)row.FindControl("gcb_selemp");
            CheckBox cb_active = (CheckBox)row.FindControl("gcb_active");

            if (cb_selemp.Checked == true)
            {
                if (!cbstatuslist.Contains(cb_index))
                    cbstatuslist.Add(cb_index);
            }
            else
            {
                cbstatuslist.Remove(cb_index);
            }
        }
        Session["childcbstatus"] = cbstatuslist;
    }

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

...