ASP.NET تغيير معرف التحكم المنسدل داخل عنصر مكرر ديناميكيا

StackOverflow https://stackoverflow.com/questions/932186

  •  06-09-2019
  •  | 
  •  

سؤال

هل يمكن لأحد أن يقول لي كيف يمكنني الحصول على هذا للعمل. أريد التمييز عن الضوابط المنسدلة داخل عنصر تحكم مكرر. أنا أفهم الآن عن الحياة وكيف ينتشر المخزن المؤقت بالفعل، ولكن ما هي بديلتي؟ هنا ما يحدث

ملف رمز

    Dim repeatTimes((TotalAdInsured - 1)) As Integer

    myRepeater.DataSource = repeatTimes
    myRepeater.DataBind()

aspfile.

<asp:Repeater ID="myRepeater" runat="server">
    <ItemTemplate>
         <asp:DropDownList ID="AdTitle<%# Container.ItemIndex %>" runat="server">
             <asp:ListItem Selected="True" Value="" Text=""/>
             <asp:ListItem Selected="False" Value="Miss" Text="Miss"/>
             <asp:ListItem Selected="False" Value="Ms" Text="Ms"/>
             <asp:ListItem Selected="False" Value="Mrs" Text="Mrs"/>
             <asp:ListItem Selected="False" Value="Mr" Text="Mr"/>
             <asp:ListItem Selected="False" Value="Other" Text="Other"/>
         </asp:DropDownList>
    </ItemTemplate>
</asp:Repeater>

إرجاع هذا الخطأ

رسالة خطأ المحلل المحلل: 'Adtitle <٪ # حاوية.Itemindex٪>' ليس معرف صالحا.

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

المحلول

أريد التمييز عن الضوابط المنسدلة داخل عنصر تحكم مكرر.

أنت لا تحتاج إلى. إليك بعض التعليمات البرمجية التي قد تساعدك على الخروج:

وضع علامة على:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label runat="server" ID="lblMsg" Text="Click a button" />
        <hr />
        <asp:Repeater runat="server" ID="rptAwesome" onitemcommand="rptAwesome_ItemCommand"
            >
            <ItemTemplate>
                <asp:Button runat="server" ID="btnAwesome"
                    Text='<%# "Button #" + Container.ItemIndex %>'
                    CommandArgument='<%# Container.DataItem %>'/><br />
            </ItemTemplate>
        </asp:Repeater>
    </div>
    </form>
</body>
</html>

CodeBehind:

using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            var x = new int[] { 1, 2, 3, 4, 5 };
            rptAwesome.DataSource = x;
            rptAwesome.DataBind();
        }
    }
    protected void rptAwesome_ItemCommand(object source, RepeaterCommandEventArgs e)
    {
        Button btnAwesome = (Button)e.CommandSource;
        lblMsg.Text = string.Format("btnAwesome.ID = {0}, e.CommandArgument = {1}", btnAwesome.ID, e.CommandArgument);
    }
}

نصائح أخرى

لا يمكنك إنشاء معرف فريد داخل مكرر من خلال العلامات من هذا القبيل. ومع ذلك، يمكنك استرداد القائمة المنسدلة في CodeBehind باستخدام findcontrol. على مكرر.

Dim adTitle As DropDownList = MyRepeater.FindControl("AdTitle")
If (Not adTitle Is Nothing) Then
  ''Do something here
End If

حسنا ... باختصار لا يمكنك فعل ما تحاول القيام به بالطريقة التي تقوم بها حاليا بذلك.

لا يمكن ضبط خاصية معرف عنصر تحكم فقط باستخدام سمة المعرف في العلامة وقيمة بسيطة. مثال: <asp:Button runat="server" id="Button1" />

أستطيع أن أرى ما تحاول القيام به، لكنني لا أفهم حقا لماذا ...

سيحتوي عنصر التحكم Repeater على عنصر واحد، لكل عنصر في DataSource الخاص بك، لذلك فهو جيد تماما لاستدعاء القائمة المنسدلة ID="AdTitle" كما سيكون ذلك مختلفا 'AdTitle' من واحد في الصف التالي.

للحصول على جانب الخادم مرة أخرى، سوف تتكرر فقط من خلال العناصر في مكررك و FindControl("AdTitle") للحصول على القائمة المنسدلة المحددة لهذا البند.

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

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

إليك العلامة:

<asp:Repeater ID="Repeater1" runat="server" >
<HeaderTemplate>Header<br /><br /></HeaderTemplate>
<ItemTemplate>
    <asp:CheckBox ID="cb" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Name") %>' />
     ...other controls removed for brevity
</ItemTemplate>
<FooterTemplate>
    <asp:Button ID="Button1" runat="server" OnClick="Submit" Text="Submit" />
</FooterTemplate>
</asp:Repeater>

قمت بإعداد وتحديد مجموعة من هذه الفئة

public class mst
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Number { get; set; }
    public bool NumberRequired { get; set; }
}

القيام اللازمة في page_load

        Repeater1.ItemDataBound += new RepeaterItemEventHandler(Repeater1_ItemDataBound);
        Repeater1.DataSource = listOfMsts;
        Repeater1.DataBind();

تليها، هذا حيث قمت بتعيين معرف:

    void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            var mst = (mst)e.Item.DataItem;
            ((CheckBox)e.Item.FindControl("cb")).ID = mst.Id.ToString();
        }
    }

لذلك عند ضرب زر إرسال، يمكنني حلقة من خلال واتزح على معرف تلك التي تم فحصها وحفظها:

  protected void Submit(object sender, EventArgs e)
    {
    foreach (var item in Repeater1.Items)
        {
            var checkboxes = ((RepeaterItem)item).Controls.OfType<CheckBox>().ToList();
            if (checkboxes[0].Checked)
            {
                Save(checkboxes[0].ID);
                ....other stuff
            }
        }
    }

يمكنك إضافة معالج حدث إلى REPETER.ITEMDATABOUND وإنشاء عنصر تحكم داخل المعالج باستخدام المرجع إلى حاوية العنصر.

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