Сортировка GridView, но CommandArgument LinkButton не является
Вид сетки отображается отлично, и сортировка по любому столбцу работает отлично. Однако при нажатии на кнопку ссылки возвращаемый CommandArgument не является правильным значением. Как будто CommandArgument привязан к строке и не сортируется.
т.е. перед сортировкой
Text Command
abc A
aaa B
aab C
после сортировки
Text Command
aaa A
aab B
abc C
нажатие на aaa вернет "A" в качестве аргумента, а не B, как должно.
GridView в файле aspx определяется следующим образом:
<asp:GridView ID="GridView1" runat="server"
AllowSorting="True"
AutoGenerateColumns="False"
EmptyDataText="No Results to Display"
GridLines="None"
onsorting="GridView1_Sorting" >
<Columns>
<asp:TemplateField HeaderText="File Name" SortExpression="Path">
<ItemTemplate>
<asp:LinkButton ID="linkbutton1" runat="server" Text='<%# Eval("Title") %>' OnCommand="LinkButton_Click" CommandArgument='<%# Bind("Path") %>' ></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField HeaderText="Document Type" DataField="DocumentCategory (Text)" SortExpression="DocumentCategory (Text)" />
</Columns>
</asp:GridView>
Он связан с davav, заполненным запросом sql и сохраненным в viewstate
ViewState["GridView1_DataSource"] = ds.Tables[0];
DataView dv = new DataView(ds.Tables[0]);
GridView1.DataSource = dv;
GridView1.DataBind();
Мой метод сортировки
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
string sortDir = "ASC";
if (ViewState["SortDirection"] == null)
ViewState["SortDirection"] = "ASC";
if (ViewState["SortDirection"].ToString() == "ASC")
{
sortDir = "DESC";
ViewState["SortDirection"] = "DESC";
}
else
{
ViewState["SortDirection"] = "ASC";
}
DataTable dt = (DataTable)ViewState["GridView1_DataSource"];
DataView dv = new DataView(dt);
dv.Sort = e.SortExpression + " " + sortDir;
GridView1.DataSource = dv;
GridView1.DataBind();
}
2 ответа
Когда вы сортируете через GridView1_Sorting, обрабатывается Page_Load, а затем GridView1_Sorting. Таким образом, данные отображаются правильно. При щелчке LinkButton Page_Load обрабатывается перед GridView1__RowCommand. Как правило, DataBind Gridview находится в Page_Load, поэтому данные теперь в исходном порядке. Чтобы исправить, поставьте сортировку также в DataBind Page_Load.
if (dt.Rows.Count> 0)
{
DataView dv = новый DataView (dt);
dv.Sort = ViewState["SortExpression"].ToString() + " " + ViewState["SortDirection"].ToString();
GridView1.DataSource = dv;
GridView1.DataBind();
}
Я не думаю, что вы можете отсортировать пустые данные.
Вы можете легко проверить это, отладив и добавив точку останова в Sorting и Page_Load.
Я нашел решение. Это сработало для меня. Попробуй это.
protected void LinkButton_Click(object sender, EventArgs e)
{
sortExpr = "Path";
GridView1_Sorting(null, null);
}
и меняя это:
string sortExpr;
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
String sortExpression = null;
if (sortExpr == null)
{
sortExpression = e.SortExpression;
}
else
{
sortExpression = sortExpr;
}
Session["SortExpression"] = sortExpression;
if (Session["SortDirection"] != null && Session["SortDirection"].ToString() == SortDirection.Descending.ToString())
{
Session["SortDirection"] = SortDirection.Ascending;
SortGridview(sortExpression, "ASC");
}
else
{
Session["SortDirection"] = SortDirection.Descending;
SortGridview(sortExpression, "DESC");
}
}
private void SortGridview(string sortExpression, string Direction)
{
DataView dv = null;
DataTable dt = GridView1.DataSource as DataTable;
dv = new DataView(dt);
dv.Sort = sortExpression + " " + Direction;
GridView1.DataSource = dv;
GridView1.DataBind();
}