2011-04-26 32 views
9

我有一个带分页的GridView。当我尝试使用gridview.rows.count对gridview行进行计数时,它只给出当前页面的行数。使用分页计算gridview的总行数

不管页面索引如何获得GridView的总行数?

//这里是.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> 

//这是我的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); 
} 
} 

现在我想将邮件发送到所有这些候选人其复选框被选中.. 我很多东西,但没有得到任何解决方案

+0

尝试这种 appForVacGrid.AllowPaging = FALSE; appForVacGrid.DataBind(); //写邮件发送代码 appForVacGrid.AllowPaging = true; appForVacGrid.DataBind(); – Mukesh 2011-04-26 11:20:48

+0

@Mukesh ..这样做的好处是什么?我尝试过,但没有任何区别。我想选择不同页面的复选框,并且只需点击一下鼠标就可以发送邮件到所有选中复选框的行.... – 2011-04-26 11:50:55

回答

6

是的,这是真的,它会只返回当前页面行。如果你真的想获得总行数,你需要从你的数据源获得。

像...如果你有数据表,然后它会像...

DataTable.Rows.Count 
+0

@穆罕默德阿赫塔尔。我用datatable.rows.count得到了总行数。现在,如果我想操纵首页的所有行,那我该怎么做? – 2011-04-26 09:44:13

+0

您需要迭代所有行。 (GridViewRow排在grid.Rows中) – 2011-04-26 09:47:11

+0

@Muhammad Akhtar。我想遍历gridview行,并且我想从dataatable中为每行提取数值,这对foreach()不可行。() – 2011-04-26 10:06:49

1

您可以使用分页的数据源来绑定gridview,它将是ver易于自定义分页并获得页数。

+0

parogrammer ..但是我没有任何分页的数据源。我有datatable其中包含gridview的所有行。除此之外,根据页面大小,只有部分行在gridview中可见。当我使用datatable.rows.count循环访问girdview时,它在当前页面之后抛出错误。不管数据源或数据表是否有任何获取当前页数的方法。如果它可以与datatable达到那么如何获取使用数据表格当前页面的行数? – 2011-04-26 09:32:11

+0

@Chirag Fanse:它引发了一个概念,因为你没有关于回发的数据。将'DataTable.Rows.Count()'存储在会话变量中以将其保留在回发中。 – Kamyar 2011-04-26 09:35:56

+0

如果您已经绑定到数据表,那么您可以使用DataTable.Rows.Count来获取行数。如果你有兴趣使用页面数据源,它是用于自定义绑定,这就是为什么我告诉。请参阅链接。 http://forums.asp.net/t/1451791.aspx – 2011-04-26 09:36:25

15

如果您使用sqldatasource或objectdatasource您需要在处理数据源的Selected事件时使用ObjectDataSourceStatusEventArgs或SqlDataSourceStatusEventArgs的ReturnValue。

如果您正在使用sqldatasource,您可以使用“选择”事件来计算总行数,在选择操作完成后触发该事件。

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

如果您使用对象数据源,需要注意的是在消耗臭氧层物质Selected事件被调用两次,一次返回的数据集,并再次给你打电话的SelectCountMethod属性指定的方法是很重要的。只需测试以查看返回是否为Int32。

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

您可以在一个工作示例:http://www.webswapp.com/codesamples/aspnet20/dropdownlist_gridview/default.aspx

如果你的GridView是由一个数据集或数据表填写:

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

如果绑定对象列表或数组,然后你可以做到以下几点:

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

是的,我想用PagedDataSource是一个更好的选择。我正在使用它。

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 ....我的问题是我有在grieview的模板字段中的复选框。我想从gridview中检索所有复选框,并基于该复选框,我想从数据表中获取记录。它不可能用你的方式...有没有其他出路? – 2011-04-26 10:09:06

+0

“我想检索gridview中的所有复选框,并基于该复选框,我希望从数据表中获取记录” 该行很容易混淆。 你可以发布你的代码,然后我可以帮你轻松。 – Mukesh 2011-04-26 10:36:02

0

如果你有一个gridview将使用填补的datatabledataset再算上datatabledatasetds.table(0).rows.count) 例如

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

喜欢这个

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

欢迎来到Stack Overflow!你会考虑增加一些叙述来解释为什么这段代码有效吗?是什么使它成为这个问题的答案?这对询问问题的人以及任何其他人来说非常有帮助。 – 2013-05-15 19:42:02

0

试(gridView.DataSource为IEnumerable <对象>).Count之间()为主要收集

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

尝试下面代码

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); 

对于例如输出将如下所示。

显示从1到15的67记录找到。

0

如果使用数据表或其他数据源进行绑定,则可以显示数据源中的总记录。 例如

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

欢迎来到Stack Overflow!除了代码之外,请考虑在答案中添加解释。 – juhist 2015-03-24 19:49:54

+0

请仔细检查以确保代码符合预期。 – 2015-03-25 00:33:08

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);