कैसे प्रोग्राम के रूप में बना सकते हैं और ASP.NET से चेक बॉक्स की एक सूची का उपयोग करने के?

वोट
4

मैं सामान की एक तालिका के साथ एक पृष्ठ है और मैं उपयोगकर्ता कार्रवाई करने के लिए पंक्तियों का चयन करने के लिए अनुमति की जरूरत है। मैं मेज पर चेक बॉक्स का एक स्तंभ जोड़ने के बारे में है, लेकिन मैं यह पता लगाने की कैसे अगर वे जाँच कर रहे हैं जब फ़ॉर्म सबमिट किया जाता परीक्षण करने के लिए नहीं कर पा रहे निकाला है। अगर वे स्थिर तत्वों थे, मैं सिर्फ कर जांच करने के लिए सक्षम होगा this.theCheckBox, लेकिन वे programaticly उत्पन्न कर रहे हैं।

इसके अलावा, मैं कैसे मैं उन्हें करने के लिए अपने डेटा संलग्न कर रहा हूँ (वहाँ आईडी संपत्ति में भरने के द्वारा) के साथ बहुत खुश नहीं हूँ।

मुझे यकीन है कि अगर यह प्रासंगिक है नहीं कर रहा हूँ, लेकिन मैं एक पकड़ने -22 का एक सा पर के रूप में मैं जाना जाता है जो चेक बॉक्स कि बनाए गए थे की जरूरत है देख रहा हूँ पिछली बार के आसपास इससे पहले कि मैं कर सकते हैं की जाँच कर रहे थे कोड है कि उन्हें बनाया फिर से चलाने के।


संपादित करें: मैं लगभग एक समाधान मिल गया है। की स्थापना करके AutoPostBackसंपत्ति और CheckedChangedघटना:

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

मैं प्राप्त कर सकते हैं कोड एक पोस्ट किसी भी चेक बॉक्स बदल गया है कि के लिए पीठ पर कहा जाता है। हालांकि इस दो समस्याएं हैं:

  • कॉल बैक के बाद संसाधित किया जाता है (या के दौरान, मैं यकीन नहीं है) Page_Load, जहां मैं इस जानकारी का उपयोग करने की आवश्यकता है
  • वापस कॉल चेक बॉक्स कि जब पेज लोड जाँच कर रहे थे और अब भी कर रहे हैं के लिए नहीं बुलाया जाता है।

संपादित करें 2:

क्या मैं एक पता उपसर्ग के साथ अपने सभी आईडी टैगिंग किया गया था और के शीर्ष पर इस भरने कर समाप्त हो गया Form_Load:

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

सब कुछ देर के लिए चलाने के लिए लगता है।

24/07/2009 को 23:16
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


7 जवाब

वोट
1

सबसे पहले, सुनिश्चित करें कि प्रत्येक चेकबॉक्स एक आईडी है कि बनाने के लिए और यह runat = "सर्वर" 'टैग में मिला है कि।

तो FindControl () फ़ंक्शन का उपयोग यह पता लगाने के लिए।

उदाहरण के लिए, आप एक GridView में सभी पंक्तियों के माध्यम से पाशन कर रहे हैं ..

foreach(GridViewRow r in Gridview1.Rows)
{

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

}
24/07/2009 को 23:44
का स्रोत उपयोगकर्ता

वोट
2

मैं तुम्हें एक DataList उपयोग कर रहे हैं ग्रहण करने के लिए जा रहा हूँ, लेकिन इस के साथ और काम करना चाहिए नियंत्रण टेम्प्लेट जा सकता है। मैं आपको यह भी DataBinding उपयोग कर रहे हैं ग्रहण करने के लिए जा रहा हूँ।

कोड मोर्चा:

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

कोड के पीछे:

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);                
        }
    }
}
25/07/2009 को 00:56
का स्रोत उपयोगकर्ता

वोट
0

आपकी पोस्ट एक छोटे से अस्पष्ट है। यह देखने के लिए कि कैसे आप मेज पर नियंत्रण जोड़ रहे हैं मदद मिलेगी। टेबल या एक नियमित HTML तालिका (एक runat = "सर्वर" विशेषता के साथ शायद जब से तुम इसे सफलतापूर्वक में आइटम शामिल किए गए हैं): यह एक एएसपी है?

आप उपयोगकर्ता चयन का एक समूह बनाते हैं करना चाहते हैं, तो एक "भेजें" बटन हिट, जिस पर आप कौन सी पंक्ति चेक किया जाता है, तो आप CheckChanged घटना नहीं निपटने जाना चाहिए आधारित प्रत्येक पंक्ति की प्रक्रिया शुरू करेंगे। अन्यथा, जैसा कि आप देखा है, तो आप एक पोस्टबैक हर बार पैदा कर रहा हो जाएगा और यह अन्य से कोई चेकबॉक्स संसाधित नहीं करेंगे। तो जब आप चेकबॉक्स eventhandler निर्धारित नहीं करते हैं तो यह एक पोस्टबैक का कारण नहीं है बनाते हैं।

अपने सबमिट बटन के eventhandler में आप प्रत्येक तालिका पंक्ति के माध्यम से लूप, सेल, तो निर्धारित करेंगे सेल के बच्चों नियंत्रण एक चेकबॉक्स निहित है या नहीं।

मैं एक तालिका का उपयोग नहीं सुझाव है। क्या आप शायद एक GridView का वर्णन कर रहे हैं या DataList एक बेहतर विकल्प है।


संपादित करें: यहाँ प्रदर्शित करने के लिए एक सरल उदाहरण है। आप परीक्षण करने के लिए एक नई परियोजना में इस काम के प्राप्त करने में सक्षम होना चाहिए।

मार्कअप

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

कोड के पीछे

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 />");
                    }
                }
            }
        }
    }
}
25/07/2009 को 00:58
का स्रोत उपयोगकर्ता

वोट
1

पोस्टबैक डेटा InitComplete घटना और प्रीलोड घटना के बीच बहाल है। यदि आपका चेक बॉक्स बाद में जब तक नहीं बन जाते हैं तो चेक बॉक्स खेलेंगे उनके घटनाओं के साथ "पकड़ने" और डेटा नियंत्रण के बाद शीघ्र ही यह बनाई गई है में लोड किया जाएगा।
इस देर से आप तो आप क्या आप पहले से ही कर रहे हैं की तरह कुछ करना होगा के लिए करने के लिए है। यही कारण है कि आप इससे पहले कि यह नियंत्रित करने के लिए दिया जाता है के बाद डेटा का उपयोग करना होगा।
आप को बचाने के लिए कर सकते हैं UniqueIdप्रत्येक की CheckBoxहै कि आप तो बनाने सीधे उन्हें एक विशेष उपसर्ग दिया बिना पोस्ट डेटा का उपयोग कर सकते हैं। आप तार जो आप के रूप में आप उन्हें उत्पन्न में आईडी को बचाने की एक सूची बनाने के बाद उन्हें देखने राज्य में सहेज कर ऐसा कर सकता है। बेशक उस दृश्य राज्य सक्षम होना आवश्यक है और viewstate में अधिक स्थान लेता है।

foreach (string uniqueId in UniqueIds)
{
    bool data = Convert.ToBoolean(Request.Form[uniqueId]);
    //...
}
27/07/2009 को 21:56
का स्रोत उपयोगकर्ता

वोट
0

क्या उपयोग करने के बारे CheckBoxList नियंत्रण? मैं कोई दृश्य स्टूडियो अभी खुले हुए है, लेकिन जहाँ तक मुझे याद है, क्योंकि यह एक डेटाबाउंड नियंत्रण, प्रदान कर रहा है DataSourceऔर DataBind()जहां क्रम एक सूची प्रदान कर सकते हैं। पेज एक पोस्टबैक करता है जब आप की तरह कुछ फोन करके सूची पार कर सकते हैं myCheckBoxList.Itemsऔर जाँच वर्तमान आइटम को फोन करके चयन किया जाता है कि क्या ListItem.Selectedविधि। यह काम करना चाहिए।

27/07/2009 को 22:03
का स्रोत उपयोगकर्ता

वोट
0

उन्हें पृष्ठ के CreateChildControls विधि है, जिसकी ओवरराइड में जोड़ें। उन्हें एक आईडी देने के लिए सुनिश्चित करें! इस तरह से वे सही समय पर नियंत्रण पेड़ से जोड़े जाते हैं।

सबसे अच्छा तरीका है databound उपयोग करने के लिए किया जाएगा IMHO वाली टेम्प्लेट नियंत्रण हालांकि, एक ListView की तरह यानी कुछ (.NET 3.5 में)। pageload में तो पोस्टबैक के बाद डेटाबाउंड नियंत्रण में सभी आइटम को पार और item.FindControl का उपयोग वास्तविक चेकबॉक्स पर प्राप्त करने के लिए।

27/07/2009 को 22:03
का स्रोत उपयोगकर्ता

वोट
0

क्या मैं एक पता उपसर्ग के साथ अपने सभी आईडी टैगिंग किया गया था और के शीर्ष पर इस भरने कर समाप्त हो गया Form_Load:

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

सब कुछ देर के लिए चलाने के लिए लगता है।

23/08/2009 को 23:05
का स्रोत उपयोगकर्ता

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