2014-09-02 4 views
0

Хорошо, насколько это возможно, у меня есть checkboxlist, у которого есть автоповтор, установленный в true и OnSelectedIndexChanged. Однако каждый раз, когда кто-то нажимает на элемент в поле, страница обновляется. Как это остановить? Я пробовал использовать UpdatePanel (это своего рода работа).Как остановить страницу от обновления каждый раз, когда установлен флажок

<asp:CheckBoxList ID="Regions" runat="server" OnSelectedIndexChanged="Regions_SelectedIndexChanged" AutoPostBack="true" DataSourceID="SqlDataSource2" DataTextField="Regions" DataValueField="ID"> 
        </asp:CheckBoxList> 

OnselectedIndexChange отображает div других флажков рядом с одним checkboxlist.

protected void Regions_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    string select = @"Select Facilities from [BulletinBoard].[DMHSAS\290974].[Facilities] "; 

    int[] ctr = new int[9]; 
    int ctr1 = 0; 
    int counter = 0; 
    dFacilities.Style.Add("display", "block"); 
    foreach (ListItem item in Regions.Items) 
    { 
     //Response.Write(item.Selected); 
     if (Regions.SelectedIndex == 0) 
     { 
      item.Selected = true; 

      CheckBoxList1.Visible = true; 
      counter++; 
     } 
     else if (item.Selected) 
     { 
      if (select.EndsWith("[Facilities] ")) 
      { 
       select += "where "; 
      } 
      if (select.EndsWith(") ")) 
      { 
       select += " or "; 
      } 
      select += " (Reg_ID = " + Regions.SelectedIndex + ") "; 

      ctr[ctr1 + 1] = Regions.SelectedIndex; 
      item.Selected = false; 
      counter++; 
      CheckBoxList1.Visible = true; 
     } 

     ctr1++; 
    } 
    if (counter == 0) 
    { 
     CheckBoxList1.Visible = false; 
     dFacilities.Style.Add("display", "none"); 
    } 

    ctr1 = 0; 
    bool all = false; 
    foreach (int counter1 in ctr) 
    { 
     Regions.Items[counter1].Selected = true; 
     if (Regions.Items[0].Selected == true) 
      foreach (ListItem item in Regions.Items) 
      { 
       if (item.Selected) 
       { 
        all = true; 
       } 
       else 
       { 
        all = false; 
        break; 
       } 
      } 
     if (all == false) 
     { 
      Regions.Items[0].Selected = false; 
     } 
    } 
+1

Так ли это работать с 'UpdatePanel' или нет? Вы все равно его не показывали. –

+0

OP говорит, используя updatepanel, это вроде сработало! – rach

+1

'UpdatePanel' просто маскирует обновление страницы. Вы все еще делаете обратную передачу. Если вы не хотите обновлять страницу, почему бы не установить 'autopostback' на' false'? – Mrchief

ответ

0

Вы, кажется, на самом деле, как классический рабочий процесс .NET обратной передачи, а не продолжать вниз WebForms путь пытается скрыть постбэки, даже если вы хотите их, потому что это делает логика проще, почему бы просто не попробовать обходя это только один раз? Если, как вы говорите, вы хотите предотвратить обновление страницы (aka postback), то есть несколько вещей, которые вы можете сделать, чтобы полностью предотвратить это.

В верхней части страницы:

<style type="text/css"> 
    .hideme 
    { 
    display: none; 
    } 
</style> 

<script type="text/javascript> 
    var checkBoxes = document.getElementById("<%= Regions.ClientID %>") 
    .getElementsByTagName("input"); 

    var cbListIDss = [ 
    "<%= CheckBoxList1.ClientID %>", 
    "etc" 
    ]; 

function toggle(i, chkElement) 
{ 
    if (chkElement.type == "checkbox") { 
    if (chkElement.checked) { 
     var cbElement = document.getElementById(cbListIDss [i]); 
     cbElement.className = cbElement.className.replace("hideme", ""); 
     break; 
    } 
    } 
} 

    for (var i = 0; i < checkBoxes.length; i++) { 
    checkBoxes[i].onClick += toggle(i, checkBoxes[i]); 
    } 
</script> 

Edit: Затем, под вашим контролем, удалить эти атрибуты: OnSelectedIndexChanged="Regions_SelectedIndexChanged" AutoPostBack="true"

Я не добавить код для изменения переменной select в вашем постбэка метод, но это можно сделать и в js через скрытое поле ввода.

С другой стороны, причина вашей панели обновления не работает, потому что у вас есть

if (Regions.SelectedIndex == 1) 
{ 
    select += " where Reg_ID = 1"; 
    dFacilities.Style.Add("display", "block"); 

// note the number at the end of this variable 
    CheckBoxList1.Style.Add("display", "block"); 
} 
if (Regions.SelectedIndex == 2) 
{ 
    select += "where Reg_ID = 2"; 
    dFacilities.Style.Add("display", "block"); 

// note the number at the end of this variable 
// All of these are adding display to CheckBoxList1, 
// even though it seems like these should be adding 
// the display property to CheckBoxList2, 3, etc. 
    CheckBoxList1.Style.Add("display", "block"); 
} 
+0

Запишите, какой номер в конце? и JavaScript, не останавливал мерцание (postback) вообще. – Jareb

+0

Кроме того, я заметил, что я могу только захватить верхнюю часть на выбранном, поэтому, если у меня есть индекс 3, и я выбираю индекс 4, он захватывает только индекс 3 и игнорирует индекс 4, пока я не разблокирую индекс 3? – Jareb

+0

добавил некоторые изменения – welegan

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