2011-04-26 83 views
9

Tengo un GridView con paginación. Cuando trato de contar la fila de gridview con gridview.rows.count, me da recuento de filas solo para la página actual.Contar filas totales de gridview con paginación

¿Cómo puedo obtener filas totales de GridView independientemente del índice de página?

// Este es el código de la página .aspx

<%@ Page Title="Search candidates based on vacancy" Language="C#" MasterPageFile="~/HR  Department/hrmasterpage.master" 
    AutoEventWireup="true" CodeFile="searcAppForVac.aspx.cs"  Inherits="HR_Department_searcAppForVac" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server"></asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1"  runat="Server"> <table width="100%"> 
    <tr> 
     <td> 
      &nbsp; 
     </td> 
    </tr> 
    <tr> 
     <td align="center" class="tdtitle"> 
      Search Candidates 
     </td> 
    </tr> 
    <tr> 
     <td> 
      <asp:ScriptManager ID="ScriptManager1" runat="server"> 
      </asp:ScriptManager> 
      <asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
       <ContentTemplate> 
        <table width="100%"> 
         <tr> 
          <td class="RowHeight" width="20%"> 
           Select Company 
          </td> 
          <td width="30%"> 
           <asp:DropDownList ID="companyList" runat="server" AppendDataBoundItems="true" AutoPostBack="True" 
            OnSelectedIndexChanged="companyList_SelectedIndexChanged" Width="150px"> 
            <asp:ListItem Text="-Select Company-" Value="-1"></asp:ListItem> 
           </asp:DropDownList> 
          </td> 
          <td width="20%"> 
           Select Department 
          </td> 
          <td width="30%"> 
           <asp:DropDownList ID="deptList" runat="server" AppendDataBoundItems="true" AutoPostBack="True" 
            onclick="Validate();" OnSelectedIndexChanged="deptList_SelectedIndexChanged" 
            Width="150px"> 
            <asp:ListItem Value="-1">-Select Department-</asp:ListItem> 
           </asp:DropDownList> 
          </td> 
         </tr> 
         <tr> 
          <td class="RowHeight" width="20%"> 
           Select Vacancy 
          </td> 
          <td colspan="3" width="*"> 
           <asp:DropDownList ID="vacanyList" runat="server" AppendDataBoundItems="true" 
            Width="200px" AutoPostBack="True" 
            onselectedindexchanged="vacanyList_SelectedIndexChanged"> 
            <asp:ListItem Value="-1">-Select Vacancy-</asp:ListItem> 
           </asp:DropDownList> 
          </td> 
         </tr> 
         <tr> 
          <td colspan="4" align="center"> 
           &nbsp; 
           <asp:Label ID="notifyLbl" runat="server" Font-Size="Large" ForeColor="Red" 
            Text="Label"></asp:Label> 
          </td> 
         </tr> 
         <tr> 
          <td colspan="4"> 
           <asp:Label ID="titleLbl" runat="server" Font-Size="Large" ForeColor="Red" 
            Text="Label"></asp:Label> 
          </td> 
         </tr> 
         <tr> 
          <td colspan="4"> 
           <asp:GridView ID="appForVacGrid" runat="server" AutoGenerateColumns="False" 
           CellPadding="4" ForeColor="#333333" AllowPaging="True" 
            onpageindexchanging="appForVacGrid_PageIndexChanging" GridLines="None" 
            PageSize="3"> 
            <RowStyle BackColor="#EFF3FB" /> 
            <Columns> 
             <asp:TemplateField> 
              <HeaderTemplate> 
               App.ID 
              </HeaderTemplate> 
              <ItemTemplate> 
               <asp:Label ID="appIdLbl" runat="server" Text='<%# Eval("AppId") %>'></asp:Label> 
              </ItemTemplate> 
             </asp:TemplateField> 
             <asp:TemplateField> 
              <HeaderTemplate> 
               First Name 
              </HeaderTemplate> 
              <ItemTemplate> 
               <asp:Label ID="firstNameLbl" runat="server" Text='<%# Eval("AppFirstName") %>'></asp:Label> 
              </ItemTemplate> 
             </asp:TemplateField> 
             <asp:TemplateField> 
              <HeaderTemplate> 
               Last Name 
              </HeaderTemplate> 
              <ItemTemplate> 
               <asp:Label ID="lastNameLbl" runat="server" Text='<%# Eval("AppLastName") %>'></asp:Label> 
              </ItemTemplate> 
             </asp:TemplateField> 
             <asp:TemplateField> 
              <HeaderTemplate> 
               Qualification 
              </HeaderTemplate> 
              <ItemTemplate> 
               <asp:Label ID="qualiNameLbl" runat="server" Text='<%# Eval("QualiName") %>'></asp:Label> 
              </ItemTemplate> 
             </asp:TemplateField> 
             <asp:TemplateField> 
              <HeaderTemplate> 
               &nbsp;Experience 
              </HeaderTemplate> 
              <ItemTemplate> 
               <asp:Label ID="Label1" runat="server" Text='<%# Eval("TotalExpYear") %>'></asp:Label> 
              </ItemTemplate> 
             </asp:TemplateField> 
             <asp:TemplateField> 
              <HeaderTemplate> 
               EmailId 
              </HeaderTemplate> 
              <ItemTemplate> 
               <asp:Label ID="emailLbl" runat="server" Text='<%# Eval("AppEmailId1") %>'></asp:Label> 
              </ItemTemplate> 
             </asp:TemplateField> 
             <asp:TemplateField> 
              <HeaderTemplate> 
               Send Mail 
              </HeaderTemplate> 
              <ItemTemplate> 
               <asp:CheckBox ID="sendMailBox" runat="server" /> 
              </ItemTemplate> 
             </asp:TemplateField> 
            </Columns> 
            <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" 
             HorizontalAlign="Right" /> 
            <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" 
             VerticalAlign="Top" /> 
            <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" /> 
            <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" 
             Font-Size="Medium" HorizontalAlign="Left" /> 
            <EditRowStyle BackColor="#2461BF" /> 
            <AlternatingRowStyle BackColor="White" /> 
           </asp:GridView> 
          </td> 
         </tr> 
         <tr> 
          <td colspan="4" align="center"> 
           &nbsp; 
          </td> 
         </tr> 
         <tr> 
          <td align="center" colspan="4"> 
           <asp:Button ID="sendMailBtn" runat="server" Height="40px" Text="SEND MAIL" 
            Width="100px" onclick="sendMailBtn_Click" /> 
          </td> 
         </tr> 
         <tr> 
          <%--<td> 
           &nbsp; 
          </td>--%> 
         </tr> 
        </table> 
       </ContentTemplate> 
       <Triggers> 
       <asp:AsyncPostBackTrigger ControlID="companyList" EventName="SelectedIndexChanged" /> 
       <asp:AsyncPostBackTrigger ControlID="deptList" EventName="SelectedIndexChanged" /> 
       <asp:AsyncPostBackTrigger ControlID="appForVacGrid" EventName="pageindexchanged" /> 
       </Triggers> 
       </asp:UpdatePanel> 

     </td> 
    </tr> 
    <tr> 
     <td> 
      &nbsp; 
     </td> 
    </tr> 
    <tr> 
     <td> 
      &nbsp; 
     </td> 
    </tr> 
</table> 

<script type="text/javascript"> 
    function alertOnBadSelection() { 
     var select = document.getElementById('companyList'); 
     if (select.options[select.selectedIndex].value == "-Select Company-") { 
      alert('Please Select Company!'); 
      return false; 
     } 
    }  
</script> 

// Este es el código de mi página aspx.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Data; 
using System.Collections; 

public partial class HR_Department_searcAppForVac : System.Web.UI.Page 
{ 
DataOperation oDo = new DataOperation(); 
AppVacancyDetailClass objAppVacDetail = new AppVacancyDetailClass(); 
protected void Page_Load(object sender, EventArgs e) 
{ 
    notifyLbl.Visible = false; 
    titleLbl.Visible = false; 
    sendMailBtn.Visible = false; 
    try 
    { 
     if (!IsPostBack) 
     { 
      // Disable department dropdown list and vacancy dropdown list till company is not selected. 
      deptList.Enabled = false; 
      vacanyList.Enabled = false; 
      //Fill Company dropdown list. 
      DataTable objCmpnyTable = oDo.DropDownList("select * from tblCompanyMaster"); 
      if (objCmpnyTable.Rows.Count > 0) 
      { 
       companyList.DataSource = objCmpnyTable; 
       companyList.DataValueField = "CompId"; 
       companyList.DataTextField = "CompName"; 
       companyList.DataBind(); 
      } 
      else 
      { 
       notifyLbl.Visible = true; 
       notifyLbl.Text = "There is not any company in the list."; 
      } 
     } 
     else 
     { 
      if (companyList.SelectedIndex <= 0) 
      { 
       //Disable department dropdown list and vacancy dropdown list till company is not selected. 
       deptList.Enabled = false; 
       vacanyList.Enabled = false; 
      } 
     } 
    } 
    catch (Exception) 
    { 
      throw; 
    } 
} 
protected void companyList_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    //Disable vacancy dropdown list till depratment list is not selected 
    vacanyList.Enabled = false; 
    appForVacGrid.DataSource = null; 
    appForVacGrid.DataBind(); 
    try 
    { 
     if (companyList.SelectedIndex > 0) 
     { 
      deptList.Enabled = true; 
      deptList.Items.Clear(); 
      string str = "select * from vwCompWiseList where CompId=" + companyList.SelectedValue; 
      DataTable objDeptTable = oDo.DropDownList("select DeptId,DeptName from vwCompWiseDept where CompId= "+companyList.SelectedValue); 
      if (objDeptTable.Rows.Count > 0) 
      { 
       deptList.DataSource = objDeptTable; 
       deptList.DataTextField = "DeptName"; 
       deptList.DataValueField = "deptId"; 
       deptList.DataBind(); 
       deptList.Items.Insert(0, new ListItem("--Select Department--", "-1")); 
      } 
      else 
      { 
       deptList.Items.Insert(0, new ListItem("--No Departments--", "-1")); 
       notifyLbl.Visible = true; 
       notifyLbl.Text = "No Departments Available in " + companyList.SelectedItem.Text; 
      } 
     } 
     else 
     { 
      notifyLbl.Visible = true; 
      notifyLbl.Text = "Select Company...."; 
      appForVacGrid.DataSource = null; 
      appForVacGrid.DataBind(); 
     } 
    } 
    catch (Exception) 
    { 

     throw; 
    }  
} 
protected void deptList_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    try 
    { 
     if (deptList.SelectedIndex > 0) 
     { 
      vacanyList.Enabled = true; 
      vacanyList.Items.Clear(); 
      DataTable objVacancytbl = oDo.DropDownList("select VacId,VacTitle from tblVacancyMaster where DeptId =" + deptList.SelectedValue + " and CompId=" + companyList.SelectedValue); 
      if (objVacancytbl.Rows.Count > 0) 
      { 
       vacanyList.DataSource = objVacancytbl; 
       vacanyList.DataValueField = "VacId"; 
       vacanyList.DataTextField = "VacTitle"; 
       vacanyList.DataBind(); 
       vacanyList.Items.Insert(0, new ListItem("--Select Vacancy--", "-1")); 
       appForVacGrid.DataSource = null; 
       appForVacGrid.DataBind(); 
      } 
      else 
      { 
       notifyLbl.Visible = true; 
       notifyLbl.Text = "ALL VACANCIES ARE CLOSED IN "+" "+deptList.SelectedItem.Text.ToUpper(); 
       vacanyList.Enabled = false; 
       appForVacGrid.DataSource = null; 
       appForVacGrid.DataBind(); 
      } 
     } 
     else 
     { 
      notifyLbl.Visible = true; 
      notifyLbl.Text = "Select Department..."; 
      appForVacGrid.DataSource = null; 
      appForVacGrid.DataBind(); 
      vacanyList.Enabled = false; 
     } 
    } 
    catch (Exception) 
    {    
     throw; 
    } 
} 
protected void vacanyList_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    try 
    { 
     DataTable AppListTbl = objAppVacDetail.GetValue("CompId=" + companyList.SelectedValue + " and DeptId=" + deptList.SelectedValue + " and VacId=" + vacanyList.SelectedValue); 
     if (AppListTbl.Rows.Count > 0) 
     { 
      appForVacGrid.DataSource = AppListTbl; 
      appForVacGrid.DataBind(); 
      appForVacGrid.Columns[5].Visible = false; 
      Session.Add("snAppListTbl", AppListTbl); 
      titleLbl.Visible = true; 
      titleLbl.Text = AppListTbl.Rows.Count.ToString() + " " + "CANDIDATE(S) ARE ELIGIBLE FOR THE POST OF" + " " + vacanyList.SelectedItem.Text.ToUpper() + "."; 
      sendMailBtn.Visible = true; 
     } 
     else 
     { 
      notifyLbl.Visible = true; 
      notifyLbl.Text = "ALL VACANCIES ARE CLOSED IN " + " " + deptList.SelectedItem.Text.ToUpper(); 
      appForVacGrid.DataSource = null; 
      appForVacGrid.DataBind(); 
     } 
    } 
    catch (Exception) 
    { 

     throw; 
    } 
} 
protected void appForVacGrid_PageIndexChanging(object sender, GridViewPageEventArgs e) 
{ 
    //DataTable AppListTbl = (DataTable)Session["snAppListTbl"]; 
    titleLbl.Visible = true; 
    titleLbl.Text = ((DataTable)Session["snAppListTbl"]).Rows.Count.ToString() + " " + "CANDIDATE(S) ARE ELIGIBLE FOR THE POST OF" + " " + vacanyList.SelectedItem.Text.ToUpper() + "."; 
    appForVacGrid.PageIndex = e.NewPageIndex; 
    appForVacGrid.DataSource = (DataTable)Session["snAppListTbl"]; 
    appForVacGrid.DataBind(); 
    sendMailBtn.Visible = true; 
} 
protected void sendMailBtn_Click(object sender, EventArgs e) 
{ 
    DataTable AppListTable = ((DataTable)Session["snAppListTbl"]); 
    int intTotalRows = AppListTable.Rows.Count; 
    string strFromId="",strToId="",strCcId="",strBccId=""; 
    string strVacTitle="",strCompName="",strMailBody=""; 
    string strSubject = "Rgarding Selection of Your Resume"; 
    Label EmailLbl; 
    //for (int intRow = 0; intRow < intTotalRows; intRow++) 
    foreach (GridViewRow Row in appForVacGrid.Rows) 
    { 
     CheckBox objSendMail = (CheckBox)Row.FindControl("sendMailBox"); 
     //CheckBox objSendMail = (CheckBox)appForVacGrid.Rows[Row].FindControl("sendMailBox"); 
     if (objSendMail.Checked) 
     { 
      if (strToId == "") 
      { 
       //strToId = AppListTable.Rows[Row]["AppEmailId1"].ToString(); 
       EmailLbl = (Label)Row.FindControl("emailLbl"); 
       strToId = EmailLbl.Text; 
      } 
      else 
      { 
       //strToId += "," + AppListTable.Rows[Row]["AppEmailId1"].ToString(); 
       EmailLbl = (Label)Row.FindControl("emailLbl"); 
       strToId +=","+ EmailLbl.Text; 
      } 
     } 
    } 
    strVacTitle = AppListTable.Rows[intTotalRows]["VacTitle"].ToString(); 
    strCompName = AppListTable.Rows[intTotalRows]["CompName"].ToString(); 
    strMailBody = CommonProcedures.GetMailBody(strVacTitle, strCompName); 
    //CommonProcedures.SendMail(strFromId, strToId, strCcId, strBccId, strSubject, null, strMailBody, false); 
} 
} 

Ahora quiero enviar correo a todos los candidatos cuya casilla de verificación está marcada ... Trid muchas cosas pero no encontré ninguna solución

+0

probar este appForVacGrid.AllowPaging = false; appForVacGrid.DataBind(); // escriba el código para enviar correos appForVacGrid.AllowPaging = true; appForVacGrid.DataBind(); – Mukesh

+0

@Mukesh .. ¿Cuál es el beneficio de hacer esto? Intenté esto pero no hace ninguna diferencia. Quiero seleccionar casillas de verificación de diferentes páginas y el correo se debe enviar con un solo clic a todas las filas cuya casilla de verificación esté seleccionada ... –

Respuesta

6

sí, eso es cierto, lo hará en solo devuelve las filas de la página actual. Si realmente desea obtener el recuento total de filas, debe obtener de su fuente de datos en su lugar.

Como ... si tiene DataTable entonces será como ...

DataTable.Rows.Count 
+0

@Muhammad Akhtar. Obtuve el recuento total de filas con datatable.rows.count. Ahora si quiero manipular todas las filas de la primera página, ¿cómo puedo hacerlo? –

+0

Necesita iterar todas las filas. foreach (fila GridViewRow en grid.Rows) –

+0

@Muhammad Akhtar. Quiero iterar filas de gridview y para cada fila quiero obtener valor de datatable para esa fila perticluar que no es posible con foreach() –

1

Puede usar un origen de datos paginado para vincular la vista de cuadrícula y será ver y fácil para la paginación personalizada y obtener el recuento de páginas.

+0

parogramador ... Pero no tengo ningún origen de datos paginado. Tengo datatable que contiene todas las filas de gridview. Fuera de eso, solo parte de las filas son visibles en gridview según el tamaño de página. Cuando recorro girdview con datatable.rows.count, arroja un error después de la página actual. ¿Hay alguna forma de obtener el conteo de páginas actual independientemente de la fuente de datos o de la tabla de datos? Si se puede lograr con datatable, ¿cómo obtener el recuento de filas de la página actual usando datatable? –

+0

@Chirag Fanse: arroja una esxception porque no tiene los datos en las devoluciones. Almacene el 'DataTable.Rows.Count()' en una variable de sesión para conservarlo en las devoluciones. – Kamyar

+0

si ya se ha vinculado a una tabla de datos, entonces puede usar DataTable.Rows.Count para obtener el recuento de filas. Si está interesado en usar el origen de datos paginado, es para el enlace personalizado, por eso le dije. Por favor mira el enlace. http://forums.asp.net/t/1451791.aspx –

15

si está utilizando sqldatasource u objectdatasource Debe usar ReturnValue de ObjectDataSourceStatusEventArgs o SqlDataSourceStatusEventArgs mientras maneja el evento Selected de la fuente de datos.

Si está utilizando sqldatasource, puede contar el total de filas utilizando el evento 'Seleccionado' que se activa después de que se ha completado la operación de selección.

protected void SqlDataSource1_Selected(object sender, SqlDataSourceStatusEventArgs e) 
{ 
    int rowCount = e.AffectedRows; 
} 

Si está utilizando la fuente de datos de objetos, es importante tener en cuenta que el evento seleccionado en el SAD se llama dos veces, una vez que devolver el conjunto de datos, y otra vez para llamar al método especificado en la propiedad SelectCountMethod. Simplemente prueba para ver si el retorno es un Int32 en el evento.

protected void ObjectDataSource1_Selected(object sender, ObjectDataSourceStatusEventArgs e) 
{ 
    if (e.ReturnValue.GetType() == typeof(System.Int32)) 
     int rowCount = (Int32)e.ReturnValue; 
} 

puede encontrar un ejemplo de trabajo en: http://www.webswapp.com/codesamples/aspnet20/dropdownlist_gridview/default.aspx

si su GridView está siendo llenado por un conjunto de datos o DataTable:

int rowCount=((DataTable)Customer).Rows.Count; 

Si va a enlazar la lista o matriz de objetos a continuación, usted puede hacer lo siguiente:

int rowCount = ((Customer[])gv.DataSource).Count; 
4

Sí creo que el uso de PagedDataSource es una mejor opción. Lo estoy usando.

PagedDataSource pds = new PagedDataSource(); 
pds.DataSource = dt_main.DefaultView; 
pds.AllowPaging = true; 
pds.PageSize = 8; 

int currentPage; 

if (Request.QueryString["page"] != null) 
{ 
    currentPage = Int32.Parse(Request.QueryString["page"]); 
} 
else 
{ 
    currentPage = 1; 
} 

pds.CurrentPageIndex = currentPage - 1; 
Label1.Text = "Page " + currentPage + " of " + pds.PageCount; 

if (!pds.IsFirstPage) 
{ 
    linkPrev.NavigateUrl = Request.CurrentExecutionFilePath + "?page=" + (currentPage - 1); 
} 

if (!pds.IsLastPage) 
{ 
    linkNext.NavigateUrl = Request.CurrentExecutionFilePath + "?page=" + (currentPage + 1); 
} 
gridMain.DataSource = pds; 
gridMain.DataBind(); 
+0

@Mukesh .... Mi problema es que tengo casillas de verificación en el campo de plantilla de grieview. Quiero recuperar todos los recuadros marcados de la vista de cuadrícula y basándome en esa casilla marcada, quiero recuperar el registro de la tabla de datos. No es posible a tu manera ... ¿Hay alguna otra salida? –

+0

"Quiero recuperar todos los recuadros marcados de la vista de cuadrícula y de acuerdo con ese recuadro marcado Deseo obtener otro registro de la tabla de datos" La línea es poco confusa. Puedes publicar tu código, entonces puedo ayudarte fácilmente. – Mukesh

0

Si usted tiene un gridview que se llenará el uso de un datatable o dataset luego contar el datatable o dataset (ds.table(0).rows.count) Por ejemplo

For cnt1 = 0 To Total_batchRecords - 1 
    dgchgsdtl1.Rows.Item(cnt1).FindControl("ControlName"), Label) 
Next 
0

gusta esta

(gridview1.DataSource as DataTable).Rows.Count(); 
+1

¡Bienvenido a Stack Overflow! ¿Consideraría agregar alguna narración para explicar por qué funciona este código y qué hace que sea una respuesta a la pregunta? Esto sería muy útil para la persona que hace la pregunta y para cualquier otra persona que se presente. –

0

intento (gridView.DataSource como objeto IEnumerable < >) .Count() para la colección principal

1
  if (Grid.DataSource == null) 
       return 0; 
      else if (Grid.DataSource.GetType() == typeof(DataTable)) 
       return (Grid.DataSource as DataTable).Rows.Count; 
      else if (Grid.DataSource.GetType().IsGenericType) 
       return (Grid.DataSource as IList).Count; 
0

Try debajo de código

int _TotalRecs = ((System.Data.DataView)GridView.DataSource).Count; 
int _CurrentRecStart = GridView.PageIndex * GridView.PageSize + 1; 
int _CurrentRecEnd = GridView.PageIndex * GridView.PageSize + GridView.Rows.Count; 

lblTitle.Text = string.Format("Displaying {0} to {1} of {2} records found", _CurrentRecStart, _CurrentRecEnd, _TotalRecs); 

Por ejemplo, La salida será como la siguiente ....

Displaying 1 to 15 of 67 registros encontrados.

0

Si está vinculando utilizando la tabla de datos u otra fuente de datos, puede mostrar el total de registros de la fuente de datos. Por ejemplo

if (dtLog != null && dtLog .Rows.Count >= 0) 
      { 
       lblTotal.Text = "Total " + Convert.ToString(dtLog .Rows.Count) + " records."; 
      } 
0
<font-color='red'><b>dim dt as datatable<Br> 
dt=gridview1.datasource<br> 
msgbox (dt.rows.count)<b></font> 
+2

¡Bienvenido a Stack Overflow! Considere agregar una explicación a su respuesta, además de solo el código. – juhist

+0

Comprueba dos veces para asegurarte de que el código es el esperado. –

0
   int a = grdvw.PageIndex; 
       int rowcount=0; 

       for (int i = 0; i < grdvw.PageCount; i++) 
       { 
        grdvw.SetPageIndex(i); 
        foreach (GridViewRow row in grdvw.Rows) 
        { 
         if (row.RowType == DataControlRowType.DataRow) 
         { 
          rowcount++; 
         } 
        } 
       } 

      grdvw.SetPageIndex(a); 
Cuestiones relacionadas