سؤال

لدي عنصر تحكم ASP.Net CheckBoxList داخل Ajax UpdatePanel.

سأقوم بتضمين الكود (C#) مع HTML أدناه.

لقد وجدت أن هناك شيئًا ما مع عدم استمرار CheckBoxList خلال عملية النشر مرة أخرى.

راجع للشغل، هو فوضوي قليلا.إنه نموذج أولي.

هذه هي الطريقة المستخدمة لملء قائمة CheckBoxList الأصلية

protected void BindCheckboxes()
{
    chkBuildings.Items.Clear();
    chkNeighborhoods.Items.Clear();
    string city = ddlFindHome_Location.SelectedItem.Value.ToLower();
    ResidentDataContext rdc = new ResidentDataContext(Utility.Lookup.GetResidentConnectionString());
    var neighs = (from n in rdc.spNeighborhoods where n.vchCity.Equals(city) select n);
    foreach (var neighborhood in neighs)
    {
        ListItem li = new ListItem();
        li.Value = neighborhood.intNeighborhoodID.ToString();
        li.Attributes["onclick"] = string.Format("document.getElementById('{0}').click();", btnNeighHack.ClientID);
        li.Text = neighborhood.vchNeighborhood;
        chkNeighborhoods.Items.Add(li);
    }
    var builds = (from b in rdc.spBuildings
                  join nb in rdc.spNeighborhoodBuildings on b.intBuildingID equals nb.intBuildingID
                  join n in rdc.spNeighborhoods on nb.intNeightborhoodID equals n.intNeighborhoodID
                  where n.vchCity.ToLower().Equals(city)
                  select b).Distinct();
    foreach (var buildings in builds)
    {
        ListItem li = new ListItem();
        li.Value = buildings.intBuildingID.ToString();
        li.Text = buildings.vchName;
        chkBuildings.Items.Add(li);
    }
    upNeighs.Update();
    upBuilds.Update();
}

يتم استدعاء BindCheckboxes() من:

protected void ddlFindHome_Location_SelectedIndexChanged(object sender, EventArgs e)
{
    BindCheckboxes();
}

هذه هي طريقة إعادة النشر لملء خانات الاختيار الخاصة بقائمة CheckBoxList أخرى

protected void btnNeighHack_Click(object sender, EventArgs e)
{
    List<int> neighs = new List<int>();

    foreach (ListItem li in chkNeighborhoods.Items)
    {
        if (li.Selected)
            neighs.Add(Convert.ToInt32(li.Value));
    }
    ResidentDataContext rdc = new ResidentDataContext(Utility.Lookup.GetResidentConnectionString());
    var builds = (from b in rdc.spBuildings
                  join nb in rdc.spNeighborhoodBuildings on b.intBuildingID equals nb.intBuildingID
                  where neighs.Contains(nb.intNeightborhoodID)
                  select b.intBuildingID).Distinct();
    foreach (ListItem li in chkBuildings.Items)
    {
        li.Selected = false;
    }
    foreach (ListItem li in chkBuildings.Items)
    {
        if (builds.Contains(Convert.ToInt32(li.Value)))
            li.Selected = true;
    }
    upBuilds.Update();
}

هنا هو ASP.Net HTML

<asp:UpdatePanel ID="upNeighs" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <div style="font-weight: bold;">
            Neighborhood
        </div>
        <div style="padding-top: 7px; padding-left: 3px;">
            <input type="checkbox" id="chkNeighborhood_CheckAll" />Select All
        </div>
        <hr />
        <div>
            <asp:CheckBoxList ID="chkNeighborhoods" runat="server" />
            <asp:Button style="display: none;" ID="btnNeighHack" runat="server" 
                onclick="btnNeighHack_Click" />
        </div>
    </ContentTemplate>
</asp:UpdatePanel>

<asp:UpdatePanel ID="upBuilds" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <div style="padding-left: 6px; padding-top: 5px; font-weight: bold;">
            Building
        </div>
        <div>
            <asp:CheckBoxList ID="chkBuildings" runat="server" />
        </div>
    </ContentTemplate>
</asp:UpdatePanel>

كان يجب أن أذكر أن الدالة bindcheckboxes() يتم استدعاؤها منها

protected void ddlFindHome_Location_SelectedIndexChanged(object sender, EventArgs e)
{
    BindCheckboxes();
}

لذلك فهو دائمًا PostBack.ولكن أعتقد أنك قد تكون على شيء مع ذلك.

هل كانت مفيدة؟

المحلول 3

بعد إجراء المزيد من البحث، وجدت أن عناصر التحكم لا تستمر خلال فترة النشر، وتخرج من حالة العرض.لذلك في كل مرة يتم الرد فيها، يتم إرجاع كائن فارغ من:

protected Control PostBackControl
{
    get { return Page.FindControl(Request.Params.Get("__EVENTTARGET")); }
}

لكنها ترى أن قيمة القائمة المنسدلة ليست القيمة الافتراضية وتبدأ في إعادة ربط كل شيء.

عندما أقوم بربط قوائم مربعات الاختيار فقط عندما تكون PostBackControl هي القائمة المنسدلة، فلن يتم ربط عناصر التحكم أبدًا نظرًا لأن كل شيء في لوحة التحديث يخرج عن النطاق.

نصائح أخرى

    protected void BindCheckboxes()
    {
        if(!IsPostBack)
{
chkBuildings.Items.Clear();
        chkNeighborhoods.Items.Clear();
        string city = ddlFindHome_Location.SelectedItem.Value.ToLower();
        ResidentDataContext rdc = new ResidentDataContext(Utility.Lookup.GetResidentConnectionString());
        var neighs = (from n in rdc.spNeighborhoods where n.vchCity.Equals(city) select n);
        foreach (var neighborhood in neighs)
        {
            ListItem li = new ListItem();
            li.Value = neighborhood.intNeighborhoodID.ToString();
            li.Attributes["onclick"] = string.Format("document.getElementById('{0}').click();", btnNeighHack.ClientID);
            li.Text = neighborhood.vchNeighborhood;
            chkNeighborhoods.Items.Add(li);
        }
        var builds = (from b in rdc.spBuildings
                      join nb in rdc.spNeighborhoodBuildings on b.intBuildingID equals nb.intBuildingID
                      join n in rdc.spNeighborhoods on nb.intNeightborhoodID equals n.intNeighborhoodID
                      where n.vchCity.ToLower().Equals(city)
                      select b).Distinct();
        foreach (var buildings in builds)
        {
            ListItem li = new ListItem();
            li.Value = buildings.intBuildingID.ToString();
            li.Text = buildings.vchName;
            chkBuildings.Items.Add(li);
        }
        upNeighs.Update();
        upBuilds.Update();
}
    }

ومحاولة ذلك.

وكذلك إذا كنت واضحا CheckBoxList الخاص بك في كل مرة تقوم بتغيير مجموعة، انها ستعمل واضحة البنود التي اخترتها أيضا. وأود أن تحميل هذه البنود في page_load بدلا من ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top