简体   繁体   English

如何在每次单击复选框时阻止页面刷新

[英]how to stop page from refreshing everytime a checkbox is click

Okay, as simple as possible, I have a checkboxlist that has autopostback set to true and a OnSelectedIndexChanged. 好的,尽可能简单,我有一个将自动回传设置为true和OnSelectedIndexChanged的复选框。 However, every time someone clicks a item in the checkbox, the page refreshes. 但是,每次有人单击复选框中的项目时,页面都会刷新。 How do I stop this? 如何停止呢? I've tried using UpdatedPanel(It kind of work). 我试过使用UpdatedPanel(这是一种工作)。

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

The OnselectedIndexChange displays a div of other checkboxes beside the one checkboxlist. OnselectedIndexChange在一个复选框列表旁边显示其他复选框的div。

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;
        }
    }

You seem to really like the classic .NET postback workflow, but rather than continue down the webforms path of trying to hide postbacks, even though you want them because it makes the logic easier, why not just try sidestepping it just this one time? 您似乎真的很喜欢经典的.NET回发工作流,但是您不想继续尝试隐藏回发的Webforms路径,即使您想要它们,因为它使逻辑更容易,为什么不尝试一次回避它呢? If, as you say, you want to prevent the page refresh (aka the postback) then there are a few things you can do to prevent it entirely. 如您所说,如果要阻止页面刷新(又称回发),则可以采取一些措施来完全阻止页面刷新。

At the top of your page: 在页面顶部:

<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: Then, in your control, remove these attributes: OnSelectedIndexChanged="Regions_SelectedIndexChanged" AutoPostBack="true" 编辑:然后,在您的控件中,删除以下属性: OnSelectedIndexChanged="Regions_SelectedIndexChanged" AutoPostBack="true"

I didn't add the code for modifying the select variable in your postback method, but that can be done in js as well via a hidden input field. 我没有在回发方法中添加用于修改select变量的代码,但是可以通过隐藏的输入字段在js中完成。

Alternatively, the reason your update panel is not working is because you have 或者,您的更新面板不起作用的原因是因为您有

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");
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM