2009-07-28 7 views
3

J'ai un ListView avec un EditItemTemplate qui appelle une méthode onItemEditing.ListView contenant CheckBoxList - Les éléments sélectionnés ne s'affichent pas comme cochés

Dans mon ListView j'ai un CheckBoxList lié en utilisant LINQ.

Dans ma méthode onItemEditing, j'essaie de vérifier certains CheckBoxes s'ils sont présents dans une table de consultation qui relie les utilisateurs avec des secteurs.

Cependant, lorsque je charge le EditItemTemplate, aucun des CheckBoxes n'est vérifié même si je les ai définis comme sélectionnés dans la méthode onItemEditing.

Voici la méthode:

protected void onItemEditing(object sender, ListViewEditEventArgs e) 
{ 
    ListView1.EditIndex = e.NewEditIndex; 
    ListView1.DataBind(); 

    int regId = Convert.ToInt32(((Label)ListView1.Items[e.NewEditIndex].FindControl("LblRegId")).Text); 
    CheckBoxList cbl = (CheckBoxList) ListView1.Items[e.NewEditIndex].FindControl("chkLstSectors"); 

//test to see if forcing first check box to be selected works - doesn't work 
    cbl.Items[0].Selected = true; 

    SqlConnection objConn = new SqlConnection(ConfigurationManager.ConnectionStrings["DaresburyConnectionString"].ToString()); 
    SqlCommand objCmd = new SqlCommand("select * from register_sectors where register_id= " + regId, objConn); 
    objConn.Open(); 

    SqlDataReader objReader = objCmd.ExecuteReader(); 

    if (objReader != null) 
    { 
     while (objReader.Read()) 
     { 
      ListItem currentCheckBox = cbl.Items.FindByValue(objReader["sector_id"].ToString()); 
      if (currentCheckBox != null) 
      { 
       currentCheckBox.Selected = true; 
      } 
     } 
    } 
} 

Toute idée comment contourner cela?

+0

Où avez-vous créé votre contrôle? En charge, sur init? –

Répondre

1

Le problème était que listView était à nouveau lié après la liaison de la checkboxlist.

J'ai enlevé la reliure et ça marche!

0

J'espère que je ne suis pas trop tard avec ma réponse;)

J'ai un CheckBoxList dans un ListView qui devrait Databind comme les autres contrôles. La valeur de la base de données est une valeur calculée à partir de cette énumération:

public enum SiteType 
{ 
    Owner = 1, 
    Reseller = 2, 
    SubReseller = 4, 
    Distributor = 8 
    Manufacturer = 16, 
    Consumer = 32 
} 

Si la valeur est de 24 cela signifie Distributeur et Fabricant (8 + 16).

J'ai ajouté un HiddenField au editItem dans mon ListView pour databinding la valeur:

<EditItemTemplate> 
    <tr> 
     <td> 
      <asp:CheckBoxList ID="cblSiteTypes" runat="server" RepeatLayout="Flow" 
       DataSourceID="ObjectDataSource4" DataTextField="Key" DataValueField="Value" /> 
      <asp:HiddenField ID="hfSiteTypes" runat="server" Value='<%# Bind("SiteType") %>' OnDataBinding="hfSiteTypesBnd" /> 
     </td> 
    </tr> 
    <!-- other data... --> 
</EditItemTemplate> 

Le CheckBoxList est rempli par une autre source de données, qui retourne un objet Dictionary avec les données de l'énumération. Dans le code derrière j'utilise la méthode OnDataBinding du HiddenField pour la sélection:

protected void hfSiteTypesBnd(object sender, EventArgs e) 
{ 
    // read the value 
    HiddenField hf = (HiddenField)sender; 
    short val = Convert.ToInt16(hf.Value); 
    // find the checkboxlist 
    CheckBoxList cblSiteTypes = (CheckBoxList)hf.Parent.FindControl("cblSiteTypes"); 
    // clear the selection (may be not needed) 
    cblSiteTypes.ClearSelection(); 
    // for each item 
    foreach (ListItem li in cblSiteTypes.Items) 
    { 
     // get the value from each item and... 
     short v = Convert.ToInt16(li.Value); 
     // ...look up whether this value is matching or not 
     if ((val & v) == v) li.Selected = true; 
    } 
} 

Et voilà!

Questions connexes