2013-12-19 3 views
0

У меня есть несколько ListBoxes как категории, отделы, факультеты и т.д. И у меня есть GridView заполняются из базы данных (MSSQL ) в код-сзади. Я буду использовать ListBoxes как фильтры .ASP.NET Руководство ListBox Фильтры для GridView

Например, когда я выбираю категорию из КатегорииListBox, GridView покажет только записи в этой категории. И когда я также выбираю Департамент, GridView покажет только записи в выбранной категории и отделе.

Я полагаю, что сделаю это с помощью selectedIndexChanged событие ListBoxes. Мой код aspx:

public partial class Default : System.Web.UI.Page 
{ 
    private string constr = MY_CONNECTION_STRING; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     FillGridView(); 
    } 

    protected void FillGridView() 
    { 
     string Query = "SELECT * FROM Entry WHERE Category = '" + SelectedCategory +"' AND Department = '" + SelectedDepartment +"'"; 
     SqlConnection conn = new SqlConnection(constr); 
     SqlCommand cmd = new SqlCommand(Query, conn); 

     try 
     { 
      conn.Open(); 
      DataTable dt = new DataTable(); 
      SqlDataAdapter da = new SqlDataAdapter(cmd); 
      da.Fill(dt); 
      GridView1.DataSource = dt; 
      GridView1.DataBind(); 

     } 
     catch (Exception ex) 
     { 
      Response.Write("Hata: " + ex.Message); 
     } 
     finally 
     { 
      conn.Close(); 
     } 
    } 

    protected void CategoriesListBox_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     // Here I want to get SelectedCategory value and re-fill GridView 
    } 

    protected void DepartmentsListBox_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     // Here I want to get SelectedDepartment value and re-fill GridView 
    } 
} 

Спасибо за помощь.

ответ

0

вы можете сделать это, выберите из таблицы, где CategoryName = @ параметра в строке подключения

@parameter ваш ListBox SelectedItem или выбранное значение.

0

Используя собственный код, почему бы не передать категорию и отдел FillGridView? И если один из них является нулевым, это не означает никакого фильтра. Так, что-то вроде этого:

protected void CategoriesListBox_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     FillGridView(lbCategory.SelectedItem.ToString(), lbDepartment.SelectedItem.ToString()); 
    } 

То же самое будет применяться на DepartmentsListBox_SelectedIndexChanged события.

Затем измените функцию FillGridView на:

protected void FillGridView(string SelectedCategory, string SelectedDepartment) 

Кроме того, если я могу, я хотел бы предложить, чтобы собрать все содержимое таблицы сразу, сохранить данные в копии в памяти и фильтровать их из указанной копии , это обеспечит гораздо более быстрый и удобный пользовательский интерфейс imo.

Edit:

  if (selectedCategory.Trim() == "") 
      selectedCategory = "IS NOT NULL"; 
     else 
      selectedCategory = " = \'" + selectedCategory.Trim() + "\'"; 

     if (selectedDepartment.Trim() == "") 
      selectedDepartment = "IS NOT NULL"; 
     else 
      selectedDepartment = " = \'" + selectedDepartment.Trim() + "\'"; 

     string Query = "SELECT * FROM Entry WHERE Category " + SelectedCategory + " AND Department " + SelectedDepartment; 

Добавьте его в начале функции FillGridView (это просто быстрый & легко взломать, не самое лучшее решение).

+0

thx, и что я должен писать для метода FillGridView() 'в PageLoad? (показать GridView без фильтров) – samet

+0

Если аргументы pass равны null, вы можете просто удалить условную часть SQL-запроса (часть WHERE дальше), чтобы вы могли сделать что-то вроде этого (проверьте изменение) –

+0

Прошу прощения за у меня возникли проблемы с редактированием кода, теперь он должен работать нормально. –

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