2008-11-20 9 views
2

Cela semble être quelque chose de simple, mais je n'arrive pas à le comprendre! J'essaye d'obtenir la liaison bidirectionnelle de données pour fonctionner sur une page ASP.net avec une case à cocher comme l'une des colonnes. Comment puis-je récupérer les valeurs mises à jour (à partir des cases à cocher) à partir du gridview ?????Obtenir des données à partir d'une case à cocher dans une colonne modèle de asp.net gridview

Voici mon type de données:

[Serializable] 
public class UserRequirements 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string UserId { get; set; } 
    public string Email { get; set; } 

    public bool ThingRequired { get; set; } 
} 

Mon balisage ressemble à quelque chose comme ceci:

<form id="form1" method="post" runat="server" > 
    <asp:GridView ID="UserTable" runat="server" AutoGenerateColumns="false" > 
    <Columns> 
     ... 
     <asp:TemplateField HeaderText="Required ?"> 
      <ItemTemplate> 
       <asp:CheckBox id="chkBox1" runat="server" on 
       Text ="Required" 
       checked='<%# DataBinder.Eval(Container.DataItem,"ThingRequired") %>'> 
       </asp:CheckBox> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
    </asp:GridView> 
    <asp:Button id="thebutton" Text="Save Changes" OnClick="UpdateRequirements" runat="server" CausesValidation=false /> 
</form> 

Mon code ressemble derrière quelque chose comme ceci:

List<UserRequirements > _userList = new List<UserRequirements >(); 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     _userList = data_layer.GetUserRequirments(); 


     this.UserTable.DataSource = _userList; 
     this.UserTable.DataBind();  
    } 

Finalement, je vais appeler quelque chose comme ça, mais je ne sais pas où cela devrait aller ou comment récupérer les valeurs de la gridview:

void UpdateRequirements(object sender, EventArgs e) 
{ 
    _userList = ???????????? // How do I get the data? 
    data_layer.UpdateUserRequirements(_userList); 
} 

Répondre

2

foreach (GridViewRow di à GridView1.Rows) {HtmlInputCheckBox chkBx = (HtmlInputCheckBox) di.FindControl ("chkBox1");

 if (chkBx != null && chkBx.Checked) 
     { 
      /// put your code here 
     } 
    } 
1

quelque chose essayer comme celui-ci pour obtenir la valeur sur le changement:

protected void OnCheckedChanged(object sender, EventArgs e) 
{  
    CheckBox c = (CheckBox)sender as CheckBox;  
    string checkBoxId = c.ID;  
    bool checkBoxValue = c.Checked; 
    //update database 
} 

[EDIT]

Si vous souhaitez obtenir toutes les valeurs des lignes de la grille dans un allez, vous devrez lier les cases à cocher en utilisant l'ID de la ligne ou de l'élément dans votre liste de UserRequirements, donc dans votre grille, faites quelque chose comme ceci:

<asp:CheckBox ID="<%# Eval('Id') %>" /> 

puis sur postback, itérer les éléments de la liste des UserRequirements correspondant à l'objet/élément Id avec les IDs des cases dans la grille .. quelque chose comme ceci:

 foreach (UserRequirement item in Requirements) 
     { 
      Control c = grid.FindControl(item.Id); 
      CheckBox cbx = c as CheckBox; 
      if (cbx != null) 
      { 
       bool value = cbx.Checked; 
       //update db 
      } 
     } 

Remarque: vous devrez peut-être utilisez FindControl de manière récursive pour rechercher les contrôles enfants ou effectuez un foreach sur chaque objet GridViewRow dans la grille pour sélectionner la case à cocher que vous recherchez.

+0

Je pense que cette façon fonctionne le mieux. N'oubliez pas de définir la propriété AutoPostBack sur "True" pour la case à cocher si vous souhaitez que la valeur soit mise à jour immédiatement après la vérification. –

Questions connexes