2009-07-28 4 views
3

Ich habe eine ListView mit einer EditItemTemplate, die eine Methode onItemEditing aufruft.ListView mit CheckBoxList - Ausgewählte Elemente nicht als überprüfte

Innerhalb meiner ListView habe ich eine CheckBoxList gebunden mit LINQ.

In meiner onItemEditing Methode versuche ich bestimmte CheckBoxes zu überprüfen, wenn sie in einer Nachschlagetabelle vorhanden sind, die Benutzer mit Sektoren verbindet.

Allerdings, wenn ich die EditItemTemplate laden keine der CheckBoxes sind überprüft, obwohl ich sie als in der onItemEditing Methode ausgewählt haben.

Hier ist die Methode:

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

Irgendwelche Ideen, wie dies zu umgehen?

+0

Wo haben Sie Ihre Kontrolle erstellt? Unter Last, init? –

Antwort

1

Das Problem war das ListView wurde wieder gebunden, nachdem die Checkboxliste gebunden wurde.

Ich entfernte die Bindung und es funktioniert!

0

Ich hoffe, ich bin nicht zu spät mit meiner Antwort;)

Ich habe einen CheckBoxList in einem Listview, die wie die anderen Kontrollen Databind sollten. Der Wert in der Datenbank ist ein berechneter Wert aus dieser Aufzählung:

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

Wenn der Wert 24 bedeutet dies, Händler und Hersteller (8 + 16).

Ich habe einen Hidden zum EditItem in meinem Listview den Wert für Datenbindung:

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

Die CheckBoxList durch eine andere Datasource gefüllt ist, die mit den Daten aus der Aufzählung ein Dictionary-Objekt zurückgibt. Im Code-behind Ich verwende die OnDataBinding Methode des Hidden für die Auswahl:

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

Verwandte Themen