Πώς να προγραμματισμού δημιουργήσετε και να χρησιμοποιήσετε μια λίστα με τα πλαίσια ελέγχου από το ASP.NET;

ψήφοι
4

Έχω μια σελίδα με έναν πίνακα πράγματα και θα πρέπει να επιτρέψει στο χρήστη να επιλέξει γραμμές για την επεξεργασία. Έχω βρει τον τρόπο για να προσθέσετε μια στήλη των πλαισίων ελέγχου στο τραπέζι, αλλά δεν μπορώ να φαίνεται να καταλάβω πώς μπορεί να ελεγχθεί εάν έχουν ελεγχθεί κατά την υποβολή της φόρμας. Αν ήταν στατικά στοιχεία, θα ήθελα να είναι σε θέση να ελέγξει ακριβώς κάνουν this.theCheckBox, αλλά είναι programaticly δημιουργούνται.

Επίσης, δεν είμαι πολύ χαρούμενος με το πώς είμαι επισυνάπτοντας τα στοιχεία μου για να τους (από το γέμισμα εκεί ακίνητο ID).

Δεν είμαι σίγουρος αν αυτό είναι σχετικό, αλλά είμαι κοιτάζοντας ένα κομμάτι από ένα catch-22 όπως πρέπει Ι γνωστό ποια από τα πλαίσια ελέγχου που δημιουργήθηκαν την τελευταία φορά ελέγχθηκαν πριν να εκτελέσετε ξανά τον κωδικό που τους δημιούργησε.


Επεξεργασία: Έχω βρει μια σχεδόν λύση. Με τον καθορισμό της AutoPostBackιδιοκτησίας και την CheckedChangedεκδήλωση:

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

Μπορώ να πάρω κωδικό που θα κληθούν σε μια θέση πίσω για κάθε πλαίσιο ελέγχου που έχει αλλάξει. Ωστόσο, αυτό έχει δύο προβλήματα:

  • Η κλήση πίσω σε επεξεργασία μετά (ή κατά τη διάρκεια, δεν είμαι σίγουρος) Page_Load, όπου θα πρέπει να χρησιμοποιήσετε αυτές τις πληροφορίες
  • Η κλήση πίσω δεν ζήτησε πλαίσια ελέγχου που ελέγχθηκαν, όταν φορτώνεται η σελίδα και εξακολουθεί να είναι.

Επεξεργασία 2:

Αυτό που κατέληξε να κάνει ήταν ετικέτες όλων ID μου με ένα πρόθεμα τεχνογνωσία και γέμιση αυτό στην κορυφή της 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 =“server”» στην ετικέτα.

στη συνέχεια, χρησιμοποιήστε τη λειτουργία FindControl () για να το βρείτε.

Για παράδειγμα, αν looping μέσα από όλες τις σειρές σε ένα 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 αλλά αυτό θα πρέπει να εργαστεί με και Ελέγχου, που μπορεί να templated. Είμαι, επίσης, πρόκειται να υποθέσουμε ότι χρησιμοποιείτε 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

Η δημοσίευσή σας είναι λίγο ασαφής. Θα σας βοηθήσει να δείτε πώς μπορείτε να προσθέσετε στοιχεία ελέγχου στον πίνακα. Είναι μια ASP: Πίνακας ή ένα κανονικό πίνακα HTML (προφανώς με runat = χαρακτηριστικό «server» αφού έχετε προσθέσει επιτυχώς αντικείμενα σε αυτό);

Αν σκοπεύετε να επιτρέπουν στο χρήστη να κάνει ένα σωρό επιλογές, στη συνέχεια, πατήστε το κουμπί «Υποβολή», οπότε θα επεξεργάζεται κάθε γραμμή με βάση ποια γραμμή είναι επιλεγμένο, τότε δεν θα πρέπει να χειρίζονται την εκδήλωση CheckChanged. Σε αντίθετη περίπτωση, όπως θα έχετε παρατηρήσει, θα προκαλέσει μια postback κάθε φορά και δεν θα επεξεργαστεί οποιοδήποτε από τα άλλα πλαίσια ελέγχου. Έτσι, όταν δημιουργείτε το πλαίσιο ελέγχου δεν ρυθμίσετε την eventhandler, ώστε να μην προκαλέσει μια καταχώρηση προς τα πίσω.

Σε eventhandler το κουμπί σας υποβάλλει μπορείτε να βρόχο μέσα από κάθε σειρά του πίνακα, κελί, στη συνέχεια να καθορίσει αν ο έλεγχος των παιδιών του κυττάρου περιείχε ένα κουτάκι.

Θα ήθελα να προτείνω να μην χρησιμοποιούν έναν πίνακα. Από αυτό που περιγράφουν ίσως ένα GridView ή DataList είναι μια καλύτερη επιλογή.


EDIT: Εδώ είναι ένα απλό παράδειγμα για να καταδείξει. Θα πρέπει να είναι σε θέση να πάρει σε ένα νέο έργο αυτής της εργασίας για να δοκιμάσετε.

σήμανση

    <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

Postback δεδομένων αποκαθίσταται μεταξύ του γεγονότος InitComplete και το γεγονός PreLoad. Αν πλαίσια ελέγχου σας δεν έχουν δημιουργηθεί μέχρι αργότερα στη συνέχεια τα πλαίσια ελέγχου θα παίξει «καλύψουν» με τις εκδηλώσεις τους και τα δεδομένα θα φορτωθούν στον έλεγχο λίγο μετά δημιουργείται.
Αν αυτή είναι αργά για σας, τότε θα πρέπει να κάνουμε κάτι σαν αυτό που ήδη κάνουν. Αυτό είναι που θα πρέπει να έχουν πρόσβαση στα δεδομένα μετά προτού δοθεί στον έλεγχο.
Εάν μπορείτε να αποθηκεύσετε το UniqueIdκαθένα CheckBoxπου δημιουργείτε στη συνέχεια μπορούν να έχουν απευθείας πρόσβαση στα δεδομένα των υστέρων, χωρίς να χρειάζεται να τους δοθεί ένα ειδικό πρόθεμα. Θα μπορούσατε να το κάνετε αυτό, δημιουργώντας μια λίστα με χορδές που μπορείτε να αποθηκεύσετε τις ταυτότητες σε όσο μπορείτε να τους δημιουργήσει και, στη συνέχεια, αποθηκεύοντάς τα σε κατάσταση προβολής. Φυσικά αυτό απαιτεί το κράτος, προκειμένου να ενεργοποιηθεί και να καταλαμβάνει περισσότερο χώρο στο viewstate.

foreach (string uniqueId in UniqueIds)
{
    bool data = Convert.ToBoolean(Request.Form[uniqueId]);
    //...
}
Απαντήθηκε 27/07/2009 στις 21:56
πηγή χρήστη

ψήφοι
0

Τι γίνεται με τη χρήση του CheckBoxList ελέγχου; Δεν έχω Visual Studio ανοίξει τώρα, αλλά όσο θυμάμαι είναι τον έλεγχο DataBound, παρέχοντας DataSourceκαι DataBind()όπου μπορείτε να παρέχετε μια λίστα κατά το χρόνο εκτέλεσης. Όταν η σελίδα κάνει μια καταχώρηση προς τα πίσω μπορείτε να διασχίσει τη λίστα καλώντας κάτι σαν myCheckBoxList.Itemsκαι ελέγξτε αν το τρέχον στοιχείο επιλέγεται με την κλήση ListItem.Selectedμεθόδου. Αυτό θα πρέπει να εργαστεί.

Απαντήθηκε 27/07/2009 στις 22:03
πηγή χρήστη

ψήφοι
0

Προσθέστε τα σε μια παράκαμψη της μεθόδου CreateChildControls της σελίδας. Να είστε βέβαιος να τους δώσει μια ταυτότητα! Με αυτό τον τρόπο να προστεθεί στο δέντρο έλεγχο στο σωστό χρόνο.

IMHO Ο καλύτερος τρόπος θα ήταν να χρησιμοποιήσετε DataBound Templated Ελέγχου όμως, δηλαδή κάτι σαν ListView (το .NET 3.5). τότε pageload μετά postback διασχίσει όλα τα αντικείμενα στον έλεγχο databound και τη χρήση item.FindControl να πάρει το πραγματικό πλαίσιο ελέγχου.

Απαντήθηκε 27/07/2009 στις 22:03
πηγή χρήστη

ψήφοι
0

Αυτό που κατέληξε να κάνει ήταν ετικέτες όλων ID μου με ένα πρόθεμα τεχνογνωσία και γέμιση αυτό στην κορυφή της 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