asp.net checkbox που κάνει updates μέσα σε gridview ή κάποιο άλλο databound list container

Συχνά όταν έχουμε ένα databound list container χρειάζεται να κάνουμε ένα γρήγορο update χωρίς να μπει το control σε edit mode.
Αυτό το επιτυγχάνουμε εύκολα με buttons ή link buttons που έχουν τις ιδιότητες CommandName & CommandArgument και γράφουμε κώδικα στο event ItemCommand του control.
Σπάνια αυτό το funcionality είναι αρκετό, και το συνηθέστερο control που χρησημιοποιύμε σε τέτοιες περιπτώσεις είναι το checkbox.
Το checkbox όμως δεν έχει ιδιότητες CommandName & CommandArgument. Άρα δεν υπάρχει το event ItemCommand και είναι πολύ δύσκολο να βρούμε σε ποια γραμμή είναι το checkbox που ξεκινάει το update.

Λύση
Όταν το checkbox ρεντάρεται σαν html δημιουργεί ένα <input type=checkbox /> και ένα <label/>. Μπορούμε να εκμεταλευτούμε αυτό το χαρακτηριστικό για να πετύχουμε το functionality που επιθυμούμε.
Πρώτα θα φτιάξουμε μια css κλάση που θα την ονομάσουμε για το παράδειγμα chkHidden   .chkHidden labeldisplay:none;}Αυτό σημαίνει πως αν ένα html element με αυτήν την κλάση εμπεριέχει ένα tag label, το label δεν θα εμφανιστεί.
Προσθέτουμε το checkbox στο gridview (ή σε κάποιο άλλο list container).
Του δίνουμε CssClass="chkHidden" Το πεδίο που είναι το κλειδί στην γραμμή το κάνουμε databind στο text property του checkbox.
Το πεδίο που θέλουμε να αλλάξουμε το κάνουνουμε databind στο checked property του checkbox.
Δίνουμε AutoPostBack=True στο checkbox.

Τώρα το marckup του control πρέπει να μοιάζει κάπως έτσι:

<asp:CheckBox ID="ActiveCheckBox" runat="server" AutoPostBack="True" Checked='<%#Eval("Active") %>'  CssClass="chkHidden" Text='<%# Eval("Id") %>' />


Στον event handler του CheckedChanged είναι που θα κάνουμε όλη την δουλειά.
Για το παράδειγμα θα θεωρήσουμε ότι το checkbox είναι σε ένα template filed ενός gridview που λέγεται lstUsers και η μέθοδος που κάνει το update λέγεται UpdateActive και δέχεται δύο παραμέτρους, το Id της γραμμής που είναι integer και το active status που είναι boolean.


    Protected Sub ActiveCheckBox_CheckedChanged(ByVal sender As Object, _
                                                ByVal e As System.EventArgs)
        'βρίσκουμε το Id από το text του checkbox που δεν είναι ορατό στο UI
        Dim i As Integer = CInt(DirectCast(sender, CheckBox).Text)
 
        'η boolean τιμή είναι το Checked του checkbox
        UpdateActive(i, DirectCast(sender, CheckBox).Checked)
 
        'καλούμε το databind του list control για να εμφανιστούν τα ενημερωμένα δεδομένα
        lstUsers.DataBind()
    End Sub

Comments

No responses to “asp.net checkbox που κάνει updates μέσα σε gridview ή κάποιο άλλο databound list container”

Post a Comment