我有一个DataTable,它从sql源获取数据并填充gridview。从sql语句排序不是一个选项,因为顺序对于进行一些初始表操作很重要。
我希望用户能够单击一列,并按照该列中的值对gridview进行排序。我用谷歌搜索了很多指南,但没有一个对我有用。列永远不可点击。我能够通过这段代码实现可执行其他操作的可点击行,并且我想知道这是否会导致任何干扰,如果没有,为什么我无法点击排序?是因为我的列不是自动生成的吗?
//可点击的行
if (e.Row.RowType == DataControlRowType.DataRow) {
GridViewRow row = e.Row;
DataRow data = ((DataRowView)row.DataItem).Row;
e.Row.Attributes.Add("onmouseover","this.style.backgroundColor='#ceedfc'");
if (data.Field<string>("rowType") != "total")
e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=''");
e.Row.Attributes.Add("style", "cursor:pointer;");
e.Row.Attributes["onclick"] = Page.ClientScript.GetPostBackClientHyperlink(suiteReport, "Select$" + e.Row.RowIndex);
我的排序尝试是
private const string ASCENDING = " ASC";
private const string DESCENDING = " DESC";
public SortDirection GridViewSortDirection
{
get
{
if (ViewState["sortDirection"] == null)
ViewState["sortDirection"] = SortDirection.Ascending;
return (SortDirection) ViewState["sortDirection"];
}
set { ViewState["sortDirection"] = value; }
}
protected void suiteReport_Sorting(object sender, GridViewSortEventArgs e)
{
string sortExpression = e.SortExpression;
if (GridViewSortDirection == SortDirection.Ascending)
{
GridViewSortDirection = SortDirection.Descending;
SortGridView(sortExpression, DESCENDING);
}
else
{
GridViewSortDirection = SortDirection.Ascending;
SortGridView(sortExpression, ASCENDING);
}
}
private void SortGridView(string sortExpression,string direction)
{
DataTable dt = (DataTable)Session["QueryTable"];
DataView dv = new DataView(dt);
dv.Sort = sortExpression + direction;
suiteReport.DataSource = dv;
suiteReport.DataBind();
}
我基于this
但是,就像我说的那样,这似乎对gridview没有任何影响。 在aspx文件中,我有属性&#34; AllowSorting&#34;等于true,OnSorting调用suiteReport_Sorting。
我不确定问题是什么,所以任何帮助都会受到赞赏。
此外,如果您有任何我想要查看的代码,请告知我们。
谢谢
编辑:以下是我处理回帖的方式
`if(!Page.IsPostBack) {
try
{
cn1.Open();
cmd1 = new SqlCommand("sp_UpdateUsageLog", cn1);
cmd1.CommandType = CommandType.StoredProcedure;
cmd1.Parameters.Add(new SqlParameter("@userName", SqlDbType.VarChar)).Value = userName;
cmd1.Parameters.Add(new SqlParameter("@userIpAddress", SqlDbType.VarChar)).Value = userIpAddress;
cmd1.Parameters.Add(new SqlParameter("@userComputerName", SqlDbType.VarChar)).Value = userComputerName;
cmd1.Parameters.Add(new SqlParameter("@pageViewed", SqlDbType.VarChar)).Value = "Store Report Card";
cmd1.Parameters.Add(new SqlParameter("@visitDate", SqlDbType.DateTime)).Value = DateTime.Now;
cmd1.ExecuteNonQuery();
}
catch { }
finally
{
cn1.Close();
}
EDIT2:以下是gridview的aspx:
<asp:GridView ID="suiteReport" AutoGenerateColumns="false" ShowFooter="true" runat="server" OnRowDataBound="suiteReport_RowDataBound" OnSelectedIndexChanged="suiteReport_SelectedIndexChanged" AllowSorting="true" OnSorting="suiteReport_Sorting">
答案 0 :(得分:0)
我相信我已经弄清楚了,或者至少取得了充分的进展。我的标题行不可点击的原因是因为我忽略了将SortExpressions添加到绑定字段。由于我是动态构建列,我通过循环遍历gridview中的标题,创建了一个新的boundfield(我以前做过)并给BoundField一个SortExpression(myBoundField.SortExpression =“headerName”)
希望这有助于任何被困的人。