2015-11-18 3 views
2

У меня есть checkboxlist, который получает его элементы из таблицы sql и меняются в зависимости от того, что выбрано в раскрывающемся меню. Я пытаюсь добавить еще один флажок в этот список, который действует как флажок select/deselect all. Я видел несколько примеров вокруг этого сайта, но, похоже, ничего не работает.Выбрать/Снять все флажок

Предполагаемые функциональные возможности: Если выбрано поле, выбраны все остальные поля.

Когда поле не выбрано, выбраны все остальные поля.

Если выбрано поле, если другое поле не выбрано, поле «Выбрать все» не выбрано.

C#:

List<ListItem> toBeRemoved = new List<ListItem>(); 

//removes items when new item from dropdown is selected 
for (int i = 1; i < CheckOpenTimesheets.Items.Count; i++) 
{ 
    toBeRemoved.Add(CheckOpenTimesheets.Items[i]); 
} 
for (int i = 0; i < toBeRemoved.Count; i++) 
{ 
    CheckOpenTimesheets.Items.Remove(toBeRemoved[i]); 
} 
lblOpenTimesheets.Text = ""; 
String sql = "sql statement here"; 
command.CommandText = sql; 
command.Parameters.Add(new SqlParameter("userid", ddlActingAs.SelectedValue.ToString())); 

SqlDataReader reader = command.ExecuteReader(); 

//Adds items to the checkboxlist 
while (reader.Read()) 
{ 
    ListItem item = new ListItem(); 
    item.Text += reader.GetDateTime(0).ToString("MM/dd/yyyy") + " is open"; 
    item.Value = reader["StartDate"].ToString(); 

    CheckOpenTimesheets.Items.Add(item); 
} 
CheckOpenTimesheets.UpdateAfterCallBack = true; 
reader.Close(); 

То, что я пытался для выделения/снятия:

protected void select_DeselectAll(object sender, System.EventArgs e) 
{ 
    if (CheckOpenTimesheets.Items[0].Selected == true) 
    { 
     foreach (ListItem item in CheckOpenTimesheets.Items) 
     { 
      item.Selected = true; 
     } 
    } 
    else 
    { 
     foreach (ListItem item in CheckOpenTimesheets.Items) 
     { 
      item.Selected = false; 
     } 
    } 
} 

ASP:

<anthem:CheckBoxList ID="CheckOpenTimesheets" OnSelectedIndexChanged="select_DeselectAll" runat="server" AutoPostBack="true" > 
    <asp:ListItem Text="Select/Deselect All" /> 
</anthem:CheckBoxList> 

Edit: Проблема, кажется, является OnSelectedIndexChanged событие стрельбы, когда выбраны флажки, отличные от выбранного всего.

Edit2: установлен флажок «Выбрать все» отдельно от флажка. Однако при попытке реализовать функцию, где, если флажок не выбран, когда установлен флажок «Выбрать все», флажок «Выбрать все» затем отменяется, но все остальные не «отменяют». Этого не происходит, потому что срабатывает событие «Выбрать все флажок».

protected void chkAll_CheckedChanged(object sender, EventArgs e) 
{ 
    foreach (ListItem item in CheckOpenTimesheets.Items) 
    { 
     item.Selected = chkAll.Checked; 
    } 
} 

protected void checkbox_Selected(object sender, EventArgs e) 
{ 
    chkAll.CheckedChanged -= chkAll_CheckedChanged; 

     foreach (ListItem item in CheckOpenTimesheets.Items) 
     { 
      if ((item.Selected = false) && (chkAll.Checked = true)) 
      { 
       chkAll.Checked = false; 
      } 
     }  
} 
+0

Что не работает? Добавление пункта выбора/отмены выбора всего? Или фактически выполняет выбор и отмену выбора других предметов? –

+0

Обновлен код с моей попыткой выбора/отмены выбора. У меня есть элемент select/deselect, добавленный в asp-код. – pfinferno

+0

Это может быть последовательность событий. Вы можете проверить/снять флажок, но потом перестроить список. В любом случае, вы можете захотеть сделать это на клиенте с помощью JavaScript/JQuery. Это было бы более удобным и быстрым. –

ответ

2

Похоже, вы понимаете свою проблему. Проблема возникает, когда вы нажимаете любой другой флажок, отличный от первого. Если первый флажок не установлен и вы установите еще один флажок, ваша логика сообщает всем из других флажков, которые нельзя проверить, в том числе тот, который вы только что отметили.

Один из вариантов - снять флажок «Выбрать/Отменить все» из CheckBoxList. Пусть это будет свой собственный автономный флажок.

<asp:CheckBox ID="chkAll" runat="server" Text="Select/Deselect All" OnCheckedChanged="chkAll_CheckedChanged" AutoPostBack="true" /> 
<anthem:CheckBoxList ID="checkOpenTimesheets" OnSelectedIndexChanged="checkOpenTimesheets_SelectedIndexChanged" runat="server" AutoPostBack="true" > 
</anthem:CheckBoxList> 

Тогда ваш выбор всех обработчиков событий просто изменит их все на одно и то же.

protected void chkAll_CheckedChanged(object sender, EventArgs e) 
{ 
    foreach(ListItem item in CheckOpenTimesheets.Items) 
    { 
     item.Selected = chkAll.Checked; 
    } 
} 

Затем также встраивать функциональность, где вы программно выбрать или отменить выбор «Выбрать/Отменить все» флажок в любое изменение CheckBoxList к чему-то другому, чем то, что все остальные. Как объяснено в this answer, ключ здесь должен был отключить событие CheckedChanged флажка select all, иначе это событие будет срабатывать, как вы видели.

protected void checkOpenTimesheets_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    chkAll.CheckedChanged -= chkAll_CheckedChanged; 

    CheckBoxList checkOpenTimesheets = (CheckBoxList)sender; 
    if (allItemsCheckedInCheckBoxList(checkOpenTimesheets)) 
    { 
     chkAll.Checked = true; 
    } 
    else if (allItemsUnCheckedInCheckBoxList(checkOpenTimesheets)) 
    { 
     chkAll.Checked = false; 
    } 

    chkAll.CheckedChanged += chkAll_CheckedChanged; 
} 

private bool allItemsCheckedInCheckBoxList(CheckBoxList checkBoxList) 
{ 
    bool allItemsChecked = true; 

    foreach (ListItem item in checkBoxList.Items) 
    { 
     allItemsChecked = item.Selected; 

     if (!allItemsChecked) 
      break; 
    } 

    return allItemsChecked; 
} 

private bool allItemsUnCheckedInCheckBoxList(CheckBoxList checkBoxList) 
{ 
    bool allItemsUnChecked = false; 

    foreach (ListItem item in checkBoxList.Items) 
    { 
     allItemsUnChecked = item.Selected; 

     if (allItemsUnChecked) 
      break; 
    } 

    return allItemsUnChecked; 
} 
+0

Хорошо, я сделал, как вы сказали, и сделал его отдельным флажком. Застрял при выборе/снятии флажка «Выбрать все», когда остальные отмечены или сняты. Я поместил код для сравнения отмеченного элемента и флажка «Выбрать все», а затем отметьте/снимите флажок «Выбрать все». Но когда это происходит, он вызывает метод chkAll_CheckedChanged и выбирает/отменяет выбор всех из них. – pfinferno

+0

@pfinferno - Отъезд [этот ответ] (http://stackoverflow.com/q/8089072/3711928). Я думаю, это то, что вам нужно. –

+0

Пробовал реализовать второй ответ на эту ссылку http://stackoverflow.com/a/8089153/2480598. Но, похоже, все не так, я обновил свой ответ двумя способами (для флажка «Выбрать все» и «checkboxlist»). – pfinferno

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