Nasıl programlı olarak oluşturmak ve ASP.NET gelen onay kutularını listesini kullanılır?

oy
4

Ben şeyler bir tablo içeren bir sayfa var ve kullanıcı işlemek satırları seçmek için izin vermeniz gerekir. Ben masaya onay kutularını bir sütun eklemek ama form gönderildiğinde onlar kontrol edilir olmadığını test edebilirsiniz anlamaya görünmüyor nasıl anladım. Onlar statik elemanlar olsaydı, ben sadece bunu kontrol etmek mümkün olurdu this.theCheckBoxama onlar programaticly oluşturulur.

Ayrıca ben (orada Kimlik özelliğinde bunu doldurma yoluyla) onlara benim veri ekleme ediyorum şekli de çok memnun değilim.

Bunun alakalı olup olmadığından emin değilim ama oluşturulan onay kutularını hangi bilinen gerekiyor gibi bir catch-22 biraz bakıyorum etrafında son kez onları yaratan kod işletilen yeniden ı önce kontrol edildi.


Düzenleme: Ben neredeyse bir çözüm buldum. Ayarlayarak AutoPostBackmülkiyet ve CheckedChangedolay:

checkbox.AutoPostBack = false;
checkbox.CheckedChanged += new EventHandler(checkbox_CheckedChanged);

Ben kodu geri değişti herhangi onay kutusu için bir yazı üzerine çağrılacak alabilirsiniz. Ancak bu iki sorun vardır:

  • Çağrı geri sonra işlenen (ya sırasında, emin değilim) olan Page_Loadbu bilgiyi kullanmak gerekir nerede
  • geri çağırma sayfa yüklendiğinde kontrol edilip hala edildi onay kutuları için çağrılmaz.

Düzenleme 2:

Ben ukala öneki ile tüm kimlikleri etiketleme ve üstündeki bu doldurma edildi yapıyor sona Ne Form_Load:

foreach (string v in this.Request.Form.AllKeys)
{
    if (v.StartsWith(Prefix))
    {
        var data = v.Substring(Prefix.Length);
    }
}

her şey geç çalıştırmak gibi görünüyor.

Oluştur 24/07/2009 saat 23:16
kaynak kullanıcı
Diğer dillerde...                            


7 cevaplar

oy
1

Öncelikle, her Onay Kutusu bir kimliği olduğundan emin olun ve onu etiketinde 'runat = 'sunucu'' var olduğunu.

daha sonra bulmak için FindControl () işlevini kullanın.

Örneğin, bir GridView tüm satırlar arasında döngü eğer ..

foreach(GridViewRow r in Gridview1.Rows)
{

    object cb = r.FindControl("MyCheckBoxId");
    if(r != null)
    {
      CheckBox chk = (CheckBox)cb;
      bool IsChecked = chk.Checked;
    }

}
Cevap 24/07/2009 saat 23:44
kaynak kullanıcı

oy
2

Sana bir DataList kullandığınız kabul edeceğim ama bu templated edilebilir Kontrolü ile çalışmak ve olmalıdır. Ben de DataBinding kullandığınız varsaymak gidiyorum.

Kod Ön:

<asp:DataList ID="List" OnItemDataBound="List_ItemDataBound" runat="server">
    <ItemTemplate>
        <asp:CheckBox ID="DeleteMe" runat="server"/>
        <a href="<%# DataBinder.Eval(Container, "DataItem.Url")%>" target="_blank">
            <%# DataBinder.Eval(Container, "DataItem.Title")%></a>
    </ItemTemplate>
</asp:DataList>
<asp:Button ID="DeleteListItem" runat="server" OnClick="DeleteListItem_Click" ></asp:Button>

Kod Arkası:

public partial class Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadList();
    }

    protected void DeleteListItem_Click(object sender, EventArgs e)
    {
        foreach (DataListItem li in List.Items)
        {
            CheckBox delMe = (CheckBox)li.FindControl("DeleteMe");

            if (delMe != null && delMe.Checked)
                    //Do Something
            }
        }

        LoadList();
    }

    protected void LoadList()
    {
        DataTable dt = //Something...
        List.DataSource = dt;
        List.DataBind();
    }

    protected void List_ItemDataBound(object sender, DataListItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
        {
            string id = DataBinder.Eval(e.Item.DataItem, "ID").ToString();
            CheckBox delMe = (CheckBox)e.Item.FindControl("DeleteMe");

            if (delMe != null)
                delMe.Attributes.Add("value", id);                
        }
    }
}
Cevap 25/07/2009 saat 00:56
kaynak kullanıcı

oy
0

Yayınınız biraz belirsiz. Bu tabloya denetimleri eklerken nasıl olduğunu görmek için yardımcı olacaktır. Tablo ya da (başarıyla kendisine ürün ekleyen beri muhtemelen bir runat = "server" özelliği ile) normal bir HTML tablosu: o bir ASP mı?

Eğer kullanıcı seçimleri bir demet yapalım niyetinde, o zaman kontrol edilir hangi satırın, o zaman CheckChanged olay işleme edilmemelidir bağlı olarak her satır işleme koyulur bunun üzerine, bir "Gönder" düğmesine basın. fark ettik gibi Yoksa, bir geri gönderme'yi her seferinde neden olacak ve diğer onay kutularından birini işlemez. Yani bunun bir geri gönderme neden olmaz böylece eventhandler ayarlamayın CheckBox oluştururken.

sizin göndermek düğmenin EventHandler size her tablo satır ile döngü, hücre, daha sonra hücrenin çocukların kontrol bir onay kutusu bulunan belirleyecek.

Bir masa kullanmayan öneririm. belki bir GridView tarif ettiğiniz veya DataList daha iyi bir seçenektir kadarıyla.


DÜZENLEME: Burada göstermek için basit bir örnek. Dışarı test etmek için yeni projede bu çalışma almak gerekir.

Biçimlendirme

    <form id="form1" runat="server">
    <div>
    <table id="tbl" runat="server"></table>
    <asp:Button ID="btnSubmit" runat="server" Text="Submit"
      onclick="btnSubmit_Click" />
    </div>
    </form>

Kod-arkasında

protected void Page_Load(object sender, EventArgs e)
{
    for (int i = 0; i < 10; i++)
    {
        var row = new HtmlTableRow();
        var cell = new HtmlTableCell();
        cell.InnerText = "Row: " + i.ToString();
        row.Cells.Add(cell);
        cell = new HtmlTableCell();
        CheckBox chk = new CheckBox() { ID = "chk" + i.ToString() };
        cell.Controls.Add(chk);
        row.Cells.Add(cell);
        tbl.Rows.Add(row);
    }
}

protected void btnSubmit_Click(object sender, EventArgs e)
{
    foreach (HtmlTableRow row in tbl.Rows)
    {
        foreach (HtmlTableCell cell in row.Cells)
        {
            foreach (Control c in cell.Controls)
            {
                if (c is CheckBox)
                {
                    // do your processing here
                    CheckBox chk = c as CheckBox;
                    if (chk.Checked)
                    {
                        Response.Write(chk.ID + " was checked <br />");
                    }
                }
            }
        }
    }
}
Cevap 25/07/2009 saat 00:58
kaynak kullanıcı

oy
1

Geri Gönderme veri ınitcomplete olayı ve preload olayı arasında restore edilmiştir. Senin onay kutularını sonrasına kadar oluşturulmaz sonra onay kutularını oynamak onların olaylarla "yakalamak" ve veri oluşturulduktan hemen sonra kontrol yüklenecektir olacak.
Bu geç o zaman zaten ne yaptığını böyle bir şey yapmak zorunda kalacaktır için ise. Yani o kontrolüne verilmeden önce yazılan verilerine erişmek zorunda kalacak olan.
Eğer kaydedebilirsiniz UniqueIdher birinin CheckBoxdoğrudan özel önek kendilerine verilen gerek kalmadan sonrası verilere erişebilir sonra oluşturduğunuz. Sen görünümü devlet onları kaydederek o zaman bunları oluşturmak olarak kimlikleri kaydetmek dizeleri listesini oluşturup bunu. Etkin olmasını görünüm durumunu gerektirir ve Görünüm durumu daha fazla yer kaplıyor Tabii.

foreach (string uniqueId in UniqueIds)
{
    bool data = Convert.ToBoolean(Request.Form[uniqueId]);
    //...
}
Cevap 27/07/2009 saat 21:56
kaynak kullanıcı

oy
0

Ne kullanmayla ilgili CheckBoxList kontrolü? Hiçbir Visual Studio şimdi açmak zorunda, ama hatırladığım kadarıyla o sağlayan bir veri sınırlama denetimi DataSourceve DataBind()nerede çalışma zamanında bir listesini sağlayabilir. Sayfa bir geri gönderme yaptığında gibi bir şey arayarak listesinde geçiş yapabilirsiniz myCheckBoxList.Itemsve geçerli öğe arayarak seçili olup olmadığını kontrol ListItem.Selectedyöntemi. Bu çalışmalı.

Cevap 27/07/2009 saat 22:03
kaynak kullanıcı

oy
0

Sayfa CreateChildControls yönteminin geçersiz kılma bunları ekleyin. Onlara bir kimlik vermek emin olun! Bu şekilde doğru zamanda kontrol ağacına ekledi olsun.

En iyi yolu veri sınırlama kullanmak olacaktır IMHO Templated Kontrolü olsa (.NET 3.5) bir ListView gibi yani bir şey. Sonra pageload içinde geri gönderme sonra veri sınırlama denetiminde tüm öğeleri geçmeli ve gerçek onay kutusunu ulaşmak için item.FindControl kullanın.

Cevap 27/07/2009 saat 22:03
kaynak kullanıcı

oy
0

Ben ukala öneki ile tüm kimlikleri etiketleme ve üstündeki bu doldurma edildi yapıyor sona Ne Form_Load:

foreach (string v in this.Request.Form.AllKeys)
{
    if (v.StartsWith(Prefix))
    {
        var data = v.Substring(Prefix.Length);
    }
}

her şey geç çalıştırmak gibi görünüyor.

Cevap 23/08/2009 saat 23:05
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more