首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

关于GridView排序的有关问题,大家帮帮忙呀!

2012-01-13 
关于GridView排序的问题,大家帮帮忙呀!!!我的GridView需要手动绑定排序,其中有一列是计算哪些列是否为空,

关于GridView排序的问题,大家帮帮忙呀!!!
我的GridView需要手动绑定排序,其中有一列是计算哪些列是否为空,我在OnRowDataBound中对每一行的所有列判断是否为空,然后把统计的数字写入统计缺项的列,但是当排序的时候,别的列可以SortExpression= "字段名 ",这个统计缺项的列如何进行排序呢?
不知道我说清楚没有,希望大家帮帮忙呀!!!

[解决办法]
不太明白,可否举个例子,说具体一点..
[解决办法]
象这种有统计列,最好还是在SQL语句或者存储过程那里处理,没有必要在前台处理.
[解决办法]
手动绑定排序?自己在sql里面排序就可以啊
[解决办法]
using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Collections;
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 TedaBus.RFPrincipal;

/// <summary>
/// 行政用车申请列表页面
/// 创建:叶明
/// 创建日期:2007-03-09
/// 修改记录:
/// </summary>
public partial class OfficeUseBus_ApplyUseBusList : SimpleCode
{
DataSet ds = new DataSet( "BusUseRecord "); //存储申请记录的数据集

protected override void OnInit(EventArgs e)
{
base.OnInit(e);
}

protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
BindUseBusRecordList();
}
}

protected void btnShowFilter_Click(object sender, EventArgs e)
{
//设置筛选Panel的可见性
pnlFilter.Visible = !pnlFilter.Visible;
}

/// <summary>
/// 绑定行政用车记录GridView
/// 涉及数据表:OfficeUseBusRecord
/// </summary>
private void BindUseBusRecordList()
{
string sql = "SELECT * FROM OfficeUseBusRecord WHERE valid = 1 AND DeptID = " + GetCurrentUserDeptID();
SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[ "TedabusMIS "].ToString());
SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
sda.Fill(ds);
DataView dv = ds.Tables[0].DefaultView;
//对于数据视图的RowFilter选项,我先将其赋值为一个总是为真的条件,然后根据用户的选择逐步增加其限制
string filterString = "1 = 1 ";
//处理开始查询的日期
if (ViewState[ "StartDate "] != null)
{
if (ViewState[ "StartDate "].ToString() != string.Empty)
{
filterString += " and UserBusDate > # " + ViewState[ "StartDate "].ToString() + "# ";
}
}
//处理最晚查询的日期
if (ViewState[ "EndDate "] != null)
{
if (ViewState[ "EndDate "].ToString() != string.Empty)
{
filterString += " and UserBusDate < # " + ViewState[ "EndDate "].ToString() + "# ";
}
}

dv.RowFilter = filterString;

//处理GridView的排序
if (ViewState[ "sort "] != null)
{
if(ViewState[ "sort "].ToString() != string.Empty)
{
dv.Sort = ViewState[ "sort "].ToString();
}
else
{
dv.Sort = " ";
}
}

gvUseBusRecord.DataSource = dv;
gvUseBusRecord.DataBind();


}

protected void gvUseBusRecord_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow) //只处理数据行
{
//将GridView中的日期显示为短日期
DateTime dt = DateTime.Parse(e.Row.Cells[0].Text);
e.Row.Cells[0].Text = dt.ToShortDateString();
//把申请的批准状态映射为中文
DataRowView row = (DataRowView)e.Row.DataItem;
e.Row.Cells[0].ToolTip = row[ "RecordID "].ToString();
if ((int)row[ "Status "] == 0)
{
e.Row.Cells[5].Text = "未批准 ";
e.Row.Cells[5].ForeColor = System.Drawing.Color.Red;
}
else if ((int)row[ "Status "] == 1)
{
e.Row.Cells[5].Text = "已批准 ";
e.Row.Cells[5].ForeColor = System.Drawing.Color.Green;
//如果申请已经批准了,就不能撤销了
LinkButton lb = (LinkButton)e.Row.Cells[7].Controls[0];
lb.Enabled = false;
}
//设置查看LinkButton的PostUrl,这样用户点击的时候会转到申请查看的页面
LinkButton lbView = (LinkButton)e.Row.Cells[8].FindControl( "lbView ");
lbView.PostBackUrl = "ViewBusUseApply.aspx?RecordID= " + row[ "RecordID "].ToString();
//为撤销按钮添加确认对话框
LinkButton lbDelete = (LinkButton)e.Row.Cells[7].Controls[0];
lbDelete.Attributes.Add( "OnClick ", "return confirm( '您是否要撤销这个申请? '); ");
}
}

protected void gvUseBusRecord_Sorting(object sender, GridViewSortEventArgs e)
{
//把GridView的排序表达式存储在ViewState中,然后重新绑定GridView
ViewState[ "sort "] = e.SortExpression;
BindUseBusRecordList();
}

protected void gvUseBusRecord_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
//把GridVew得到PageIndex设置为新值,然后重新绑定GridView
gvUseBusRecord.PageIndex = e.NewPageIndex;
BindUseBusRecordList();
}

protected void btnSetFilter_Click(object sender, EventArgs e)
{
//用户点击设置筛选条件的按钮时,我把筛选条件存入ViewState,具体的工作,绑定GridView的时候会处理
ViewState[ "StartDate "] = txtStart.Text;
ViewState[ "EndDate "] = txtEnd.Text;
BindUseBusRecordList();
}

protected void gvUseBusRecord_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
//点击删除的时候,只是将Valid字段设置为0,并没有物理删除
//如果其他表中出现过的车辆被 "删除 ",可以避免出现错误
string sql = "UPDATE OfficeUseBusRecord SET valid = 0 WHERE RecordID = " + gvUseBusRecord.Rows[e.RowIndex].Cells[0].ToolTip ;
SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[ "TedabusMIS "].ToString());
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
if(cmd.ExecuteNonQuery() > 0)
{
BindUseBusRecordList();
RegisterStartupScript( "message ", " <script language= 'JavaScript '> alert( '删除成功 '); </script> ");
}
else
{
RegisterStartupScript( "message ", " <script language= 'JavaScript '> alert( '删除失败 '); </script> ");
}
conn.Close();
conn.Dispose();
}

/// <summary>
/// 利用当前用户的登录名获取当前用户所在的部门编号
/// 涉及数据表:EmployeeBaseInfo
/// </summary>
/// <returns> 当前用户所在的部门编号 </returns>


private string GetCurrentUserDeptID()
{
string result = " ";
//获取当前登录的用户的员工编号
//P.S. 如果无法得到当前用户所在的部门,请在这里Response一下,很可能就是下面的变量没有得到
string userName = ((SitePrincipal)Context.User).UserCardNum.ToString();

if (userName != string.Empty)
{
string sql = "SELECT DepID FROM EmployeeBaseInfo WHERE EmployeeNo = ' " + userName + " ' ";
SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[ "TedabusMIS "].ToString());
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
try
{
//因为只有一个字段,我用的是SqlCommand的ExecuteScalar方法
result = cmd.ExecuteScalar().ToString();
}
catch
{
result = " ";
}
finally
{
cmd.Dispose();
conn.Close();
conn.Dispose();
}
}
//Response.Write( "dept: " + result + " user " + userName);
return result;
}
}

[解决办法]
自己在sql语句里面排序就可以啊
[解决办法]
新建一个DataSet,然后逐一加上你GridView上面要绑定的字段
计算哪些列是否为空的这一列你也加上去
这样的话就可以进行绑定排序了
这个方法我没有试过
你先试试看

DataSet ds_Test = new DataSet( "Test ");
ds_Test.Reset();

DataTable dt_Test = new DataTable( "testTable ");
dt_Test.Clear();
//加入字段名
dt_Test.Columns.Add( "CS_DIVISION_NM ", typeof(String));
dt_Test.Columns.Add( "CS_ACCEPT_CNT1 ", typeof(String));
dt_Test.Columns.Add( "CS_ACCEPT_CNT2 ", typeof(String));
dt_Test.Columns.Add( "CS_ACCEPT_CNT3 ", typeof(String));
dt_Test.Columns.Add( "CS_DIVISION_ID ", typeof(String));

//对新建的DataSet进行赋值
DataRow dr_TestRow;
for (int intILoop = 0; intILoop < _dsTotalList.C_MonthAll.Rows.Count; intILoop++)
{
dr_TestRow = dt_Test.NewRow();
dr_TestRow[ "CS_DIVISION_NM "] = "aa ";
dr_TestRow[ "CS_ACCEPT_CNT1 "] = _dsTotalList.C_MonthAll.Rows[intILoop][ "CS_ACCEPT_CNT1 "].ToString();
dr_TestRow[ "CS_ACCEPT_CNT2 "] = _dsTotalList.C_MonthAll.Rows[intILoop][ "CS_ACCEPT_CNT2 "].ToString();
dr_TestRow[ "CS_ACCEPT_CNT3 "] = _dsTotalList.C_MonthAll.Rows[intILoop][ "CS_ACCEPT_CNT3 "].ToString();
dr_TestRow[ "CS_DIVISION_ID "] = "bb ";
dt_Test.Rows.Add(dr_TestRow);
}

ds_Test.Tables.Add(dt_Test);

在这里进行排序操作

最后进行绑定
gv.DataSource = ds_Test.Tables[ "testTable "];
gv.DataBind();
[解决办法]
跟girdview 似乎不太关系

主要还是存储过程里


[解决办法]
up
[解决办法]
我没看太懂,不过帮一点微簿之力,帮楼主顶一下吧
[解决办法]
大家不要都为了.net 而.net了
很多东西
可以在sql 存储过程中 处理更 方便的
为什么
非的去用dataset datatable filter.......
不解 ...


[解决办法]
同意hertcloud(·£孙子兵法£·) 的说法
[解决办法]
最好在sql里面就把他统计好,什么问题都解决了
[解决办法]
顶楼上的 好主意
[解决办法]
记得我好象以前问过和这个类似的问题
只是我那个是模板列根据CheckBox来排序
也是因为没有SortExpression而在排序时产生问题
daishengs(横舟摆渡)给了我一个这样的方法
你看看吧,不知道对你的问题有没有帮助

<asp:TemplateColumn >
<HeaderStyle Width= "20px "> </HeaderStyle>
<ItemTemplate>
<asp:CheckBox id= "CheckBox1 " runat= "server "> </asp:CheckBox>
<asp:Label id= "lblID " runat= "server " Text= ' <%# DataBinder.Eval(Container, "DataItem.ID ") %> ' Visible =False>
</asp:Label>
</ItemTemplate>
</asp:TemplateColumn>


CheckBox chkExport;
String sID, NoCheck= " ",Checked= " ",Order_by= " ",Code = " ";
//循环取的DataGrid控件中选定项的值
foreach(DataGridItem oDataGridItem in grid.Items)
{

chkExport = (CheckBox)oDataGridItem.FindControl( "CheckBox1 ");
sID = ((Label)(oDataGridItem.FindControl( "lblID "))).Text;
//如果选中了则取值
if(chkExport.Checked)
{
Checked=Checked+ sID + ", ";
}
else
{
NoCheck=NoCheck+ sID + ", ";
}
}
Code =Checked+NoCheck ;
if(Code== " ")
{
Code = Code.Substring(0,Code.Length-1);
}
Order_by= " Order by Charindex(cast(ID as varchar(50)), ' " + Code + " ') ";

//String strsql= "SELECT * FROM mytable " + Order_by;


热点排行