Навигация по страницам gridview из значений url
у меня есть база данных, управляемая gridview с включенной подкачкой. Все работает нормально, и привязывается следующим образом на page_load:
sqldataadapter da = new saldatadapter("sql query"), con);
datatable dt = new datatable();
gridview1.datasource = dt;
gridview1.databind();
есть ли опция, которую я могу включить, чтобы номер страницы автоматически появлялся в url-адресе? Почему я хочу делать это так я могу отправить URL-адрес с номером страницы, когда пользователь нажимает на URL-адрес, это вызывает GridView для отображения данных из нужной странице.
UPDATE 2-текущий полный код как запрошено:
public partial class conflict_search_Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
if (Request.QueryString["page"] != null)
{
int index = int.Parse(Request.QueryString["page"]);
GridView1.PageIndex = index;
BindData();
}
else
{
BindData();
}
}
else
{
BindData();
}
}
private void BindData()
{
SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["connString"]);
SqlDataAdapter da = new SqlDataAdapter("sql query here which returns over 100 pages", con);
DataTable dt = new DataTable();
da.Fill(dt);
GridView1.DataSource = dt;
GridView1.DataBind();
}
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
int index = e.NewPageIndex + 1;
string url = HttpContext.Current.Request.Url.AbsoluteUri;
e.Cancel = true;
Response.Redirect(string.Format("{0}?page={1}", url, index));
}
protected void GridView1_PageIndexChanged(object sender, EventArgs e)
{
BindData();
}
}
это дает мне ошибку, когда я пытаюсь нажать на номера подкачки в нижней части datagrid. Ошибка заключается в следующем:
если я загружу страницу свежей, она загрузится. Если я нажимаю на номер страницы 5, отображается ?page=5
в url-адресе, который я ожидаю, но по какой-то причине Страница 6 выбрана на номерах страниц в нижней части экрана. Если я затем щелкните страницу 10, например, url-адрес изменится на ?page=5?page=10
что явно неправильно, что дает ошибку:
Input string was not in a correct format.
int index = int.Parse(Request.QueryString["page"]);
5 ответов
Если вы измените код в функции GridView1_PageIndexChanging, как показано ниже, все будет работать:
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
e.Cancel = true;
int index = e.NewPageIndex;
string urlPath = HttpContext.Current.Request.Url.AbsoluteUri;
Uri uri = new Uri(urlPath);
string url = uri.GetLeftPart(UriPartial.Path);
Response.Redirect(string.Format("{0}?page={1}", url, index));
}
Также вам не нужно Гендель GridView1_PageIndexChanged
событие.
использование:
protected void GridView1_PageIndexChanging(Object sender, GridViewPageEventArgs e)
{
int index = e.NewPageIndex + 1;
string url = HttpContext.Current.Request.Url.AbsoluteUri;
e.Cancel;
Response.Redirect(string.Format("{0}?page={1}", url, index));
}
PageLoad(...)
{
if (!Page.IsPostBack)
{
if (Request.QueryString["page"] != null)
{
int index = int.Parse(Request.QueryString["page"]);
// bind your gridview
GridView1.PageIndex = index;
}
}
}
попробуйте это, установите PageIndex перед BindData ()
if (!Page.IsPostBack)
{
if (Request.QueryString["page"] != null)
{
int index = int.Parse(Request.QueryString["page"]);
GridView1.PageIndex = index;
BindData();
}
else
{
BindData();
}
}
когда вы изменяете индекс страницы для gridview, вы должны его повторно привязать или установить индекс страницы перед привязкой:
if (!string.IsNullOrEmpty(Request.QueryString["page"]) && int.Parse(Request.QueryString["page"]) < GridView1.PageCount)
{
GridView1.PageIndex = int.Parse(Request.QueryString["page"]);
GridView1.DataBind();
}
Почему ты называешь BindData()
on GridView1_PageIndexChanged
и при отладке исключения, что именно вы получаете в качестве значения для Request.QueryString["page"]
может быть, я ошибаюсь, но имеет ли это какую-либо ценность вообще?