2015-03-11 4 views
-1

Я хочу отфильтровать данные, используя два CheckBoxList, и результат должен быть показан в GridView. Мои данные хранятся в базе данных SQL Server. Я сделал какой-то код, но он не работает, когда я проверяю некоторые коробки, ничего не происходит. Вот мой кодфильтр с помощью checkboxlist

public partial class test : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      BindList(); 
     } 
    } 
    protected void gvDemo_PageIndexChanging(object sender, GridViewPageEventArgs e) 
    { 
     gvDemo.PageIndex = e.NewPageIndex; 
     BindList(); 
    } 

    private void BindList() 
    { 
     string conString = ConfigurationManager.ConnectionStrings["YMMDMSConnectionString"].ConnectionString; 
     string query = "SELECT ID,Client,Projet,Date,Shift,CodDefaut FROM cascad"; 
     string condition = string.Empty; 
     foreach (ListItem item in shift.Items) 
     { 
      condition += item.Selected ? string.Format("'{0}',", item.Value) : ""; 
     } 
     if (!string.IsNullOrEmpty(condition)) 
     { 
      condition = string.Format(" where Shift in ({0})", condition.Substring(0, condition.Length - 1)); 
     } 

     string condition2 = string.Empty; 
     foreach (ListItem item in client.Items) 
     { 
      condition2 += item.Selected ? string.Format("'{0}',", item.Value) : ""; 
     } 
     if (!string.IsNullOrEmpty(condition2)) 
     { 
      condition2 = string.Format(" AND Client = {0}", condition2.Substring(0, condition2.Length - 1)); 
     } 
     SqlCommand cmd = new SqlCommand(query + condition + condition2); 

     using (SqlConnection con = new SqlConnection(conString)) 
     { 
      using (SqlDataAdapter sda = new SqlDataAdapter()) 
      { 
       cmd.Connection = con; 
       sda.SelectCommand = cmd; 
       using (DataSet ds = new DataSet()) 
       { 
        sda.Fill(ds); 
        gvDemo.DataSource = ds; 
        gvDemo.DataBind(); 
       } 
      } 
     } 
    } 

    protected void shift_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     BindList(); 

    } 

    protected void client_SelectedIndexChanged(object sender, EventArgs e) 
    { 

     foreach (ListItem item in shift.Items) 
     { 
      if (item.Selected == true) 
      { 
       BindList(); 
      } 
     } 
    } 

}

Что мне не хватает?

+1

Когда вы отлаживаете это - потому что я предполагаю, что вы отлаживали это, конечно, - каков полный запрос SQL, который вы отправляете на сервер? –

+0

Почему вы называете 'BindList' в цикле? Вам просто нужно позвонить ему один раз (при необходимости). –

+0

У меня есть два ChechBoxList: shift & client, полный запрос: query + condition + condition2, и это зависит от того, какие поля я проверил – Lamyae

ответ

0

Вы don't really need to dispose a DataSet or DataTable (даже если он реализует IDisposable, он делает это только для дизайнерских материалов). Таким образом, using является избыточным. Это может также вызвать проблему, если вы используете размещенный DataSet как DataSource.

Так просто:

DataSet ds = new DataSet()) 
sda.Fill(ds); 
gvDemo.DataSource = ds; 
gvDemo.DataBind(); 

Кроме того, не ясно, если созданный SQL-запрос является правильным. Вы подтвердили, что он работает в Sql-Server Management-Studio?

Кстати, почему вы звоните BindList в петлю? Вам просто нужно позвонить ему один раз (при необходимости). Так что это может быть более подходящим:

bool needToDatabind = false; 
foreach (ListItem item in shift.Items) 
{ 
    if (item.Selected == true) 
    { 
     needToDatabind = true; 
     break; 
    } 
} 
if(needToDatabind) BindList(); 

или более кратким:

var selectedItems = shift.Items.Cast<ListItem>().Where(i => i.Selected); 
if(selectedItems.Any()) BindList(); 
+0

Спасибо, Тим, но я не думаю, что проблема в цикле. Я пробовал код u're, но он не работает. Для запроса я не знаю, как его проверить в Sql Server Management Studio – Lamyae

+0

@Lamyae: установите точку останова в 'sda.SelectCommand = cmd;' и возьмите sql-запрос, который вы найдете в 'cmd.CommandText'. Что означает, что он не работает, вы получаете сообщение об ошибке? –

+0

Проблема не дает мне никаких ошибок, поэтому я не могу определить, где она находится – Lamyae

0

Убедитесь, что вы сделали AutoPostBack="true" вашему Check Box.

enter image description here

добавить точку останова нажмите, чтобы добавить точку останова, как в изображении и нажмите F5 для отладки.

Надеюсь, что эта помощь?

+0

Должен ли я добавить AutoPostBack = "true" для каждого CheckBoxList ?? – Lamyae

+0

Вы используете панель обновления? вы пытались отладить свой код? –

+0

Я не использую панель обновления и, конечно же, отлаживаю код, но он не работает и не дает мне никакой ошибки – Lamyae

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