2015-12-29 3 views
0

У меня есть DataList, чтобы отображать множество элементов, поэтому я использую метод подкачки и поиска, чтобы фильтровать и упрощать работу, обе работают нормально. Однако, когда дело доходит до пейджинга после поиска, данные обратно в (SELECT *), но не конкретный товар им в поискахПейджинг DataList с результатом поиска

то, что я сделал до сих пор:

SqlDataAdapter adap; 
    DataSet ds; 
    PagedDataSource adsource; 
    int pos; 

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      this.ViewState["vs"] = 0; 
      pos = (int)this.ViewState["vs"]; 

      databind(); 
      databind2(); 
     } 
    } 

public void databind() 
    { 
     adap = new SqlDataAdapter("select p.item_code as pitem, i.LongDesc as longname, p.SellPrice_1 as normalprice, p.SellPrice_2 as memberprice from plu p inner join item i on p.item_code = i.item_code WHERE p.publish =1 order by i.LongDesc", constr); 
     ds = new DataSet(); 
     adsource = new PagedDataSource(); 
     adap.Fill(ds); 
     adsource.DataSource = ds.Tables[0].DefaultView; 
     adsource.PageSize = 16; 
     adsource.AllowPaging = true; 
     adsource.CurrentPageIndex = pos; 
     CategoryList.DataSource = adsource; 
     CategoryList.DataBind(); 
    } 

фильтр часть показывает, как показано ниже

public void Filter_Command(Object source, DataListCommandEventArgs e) 
    { 
     if (e.CommandName.Equals("Filter")) 
     { 
      adap = new SqlDataAdapter("select p.item_code as pitem, i.LongDesc as longname, p.SellPrice_1 as normalprice, p.SellPrice_2 as memberprice, d.department_code as dcode, d.category_code as dcatecode, c.category_code as ccode from plu p inner join item i on p.item_code = i.item_code inner join EPO_PDU_department d on d.department_code = i.department_code inner join EPO_PDU_Category c on c.category_code = d.category_code WHERE p.publish =1 AND c.category_code = '" + e.CommandArgument.ToString() + "'order by i.LongDesc ", constr); 
      ds = new DataSet(); 
      adsource = new PagedDataSource(); 
      adap.Fill(ds); 
      adsource.DataSource = ds.Tables[0].DefaultView; 
      adsource.PageSize = 16; 
      adsource.AllowPaging = true; 
      adsource.CurrentPageIndex = pos; 
      btnprevious.Enabled = !adsource.IsFirstPage; 
      btnnext.Enabled = !adsource.IsLastPage; 
      CategoryList.DataSource = adsource; 
      CategoryList.DataBind(); 
     } 
    } 

кнопки, которые я использовал:

protected void btnprevious_Click(object sender, EventArgs e) 
    { 
     pos = (int)this.ViewState["vs"]; 
     pos -= 1; 
     this.ViewState["vs"] = pos; 
     databind(); 
    } 

    protected void btnnext_Click(object sender, EventArgs e) 
    { 
     pos = (int)this.ViewState["vs"]; 
     pos += 1; 
     this.ViewState["vs"] = pos; 
     databind(); 
    } 

поиска и пейджинговой работают отлично друг от друга. но я хотел бы, чтобы они работали вместе. благодаря

******* ******* UPDATE

в случае Rik требуется дополнительная информация the errors occurred

+0

После нажатия кнопки вы привязываете нефильтрованные данные 'databind()' – Rik

+0

Я заметил, что, но я не уверен, как мне исправить это? – TheButterfly

+0

Сделайте свою привязку к фильму, если таковой имеется – Rik

ответ

1

сделать вас DataBind применить фильтр, если

public void databind(string filter = null) 
{ 
    var filterQuery = ""; 
    if(!string.IsNullOrEmpty(filter)){ 
     filterQuery = " AND c.category_code = '" + filter + "'"; 
     this.ViewState.ContainsKey("filter") 
      ? this.ViewState["filter"] = filter 
      : this.ViewState.Add("filter", filter); 
    } 

    var query = "select p.item_code as pitem, i.LongDesc as longname, p.SellPrice_1 as normalprice, p.SellPrice_2 as memberprice from plu p inner join item i on p.item_code = i.item_code WHERE p.publish =1"; 
    query += filterQuery; 
    query += " order by i.LongDesc"; 

    adap = new SqlDataAdapter(query, constr); 
    ds = new DataSet(); 
    adsource = new PagedDataSource(); 
    adap.Fill(ds); 
    adsource.DataSource = ds.Tables[0].DefaultView; 
    adsource.PageSize = 16; 
    adsource.AllowPaging = true; 
    adsource.CurrentPageIndex = pos; 
    CategoryList.DataSource = adsource; 
    CategoryList.DataBind(); 
} 

и затем процеживают команду:

public void Filter_Command(Object source, DataListCommandEventArgs e) 
{ 
    string filter = e.CommandName.Equals("Filter") ? e.CommandArgument.ToString() : null; 
    databind(filter); 
} 

и ваши кнопки

protected void btnprevious_Click(object sender, EventArgs e) 
{ 
    pos = (int)this.ViewState["vs"]; 
    pos -= 1; 
    this.ViewState["vs"] = pos; 
    databind(this.ViewState["filter"]); 
} 

protected void btnnext_Click(object sender, EventArgs e) 
{ 
    pos = (int)this.ViewState["vs"]; 
    pos += 1; 
    this.ViewState["vs"] = pos; 
    databind(this.ViewState["filter"]); 
} 

Убедитесь this.ViewState["filter"] определен (Вы можете сделать то же, что и для вашего this.ViewState["vs"]

+0

интересным кодом, но он показывает мне, что filterSource и filterEvents еще не объявляются, так что? – TheButterfly

+0

ваш отредактированный имеет 2 видовых экрана на кнопке, я считаю, что фильтр слов в кнопке принадлежит правилу привязки данных? он должен быть объявлен или должен быть filter = this.ViewState ["filter"]; ??? – TheButterfly

+0

Извините, я немного кратковременен. Вы также должны выполнить некоторые проверки фильтра viewstate. Viewstate - это массив, так что все в порядке. Обновится сегодня днем. Надеюсь, вам это удастся. – Rik

0

Вы можете создать общую функцию DataBind, которая будет ожидать параметр для поиска также , .. тогда используйте эту функцию всюду.

+0

Вы имеете в виду, что я могу на самом деле установить «WHERE item = ???» на databind, и поэтому, когда я ищу и подкачки продолжат без проблем? Я устал, но, к сожалению, я использовал e.command («фильтр»), поэтому я не смог сделать как метод – TheButterfly

Смежные вопросы