2010-04-30 11 views
5

ich nicht Repeater für viel mehr als nur Daten aus einer Datentabelle zeigt, die verwendet haben.Repeater und fügen Sie Spalten und itemtemplate auf Seite Last header

Ich baue ein Raster, das eine Liste der Benutzer und Spalten der Rollen zeigt, denen der Benutzer zugewiesen wurde, mit Checkboxen (unten mit True/False angezeigt, aber sie sind Kontrollkästchen).

ex.

| Rep Name | Anrufer | Schließer | Manager | SuperUser |
| Bob                       | true | true     | falsch           | falsch |
| Tom                   | false   | false   | Wahre           | Wahr |

Grundsätzlich für die Rollenverwaltung verwenden.

Die Rollen können sich jedoch später ändern, daher möchte ich die Rollen (Header und Elemente) dynamisch in den Repeater laden.

Ich bin mir nicht sicher, wie das geht oder ob es überhaupt möglich ist.

Ich nehme an, Sie greifen eine Liste der aktuellen Rollenmöglichkeiten und laden Sie sie in das headertemplate, aber ich bin mir nicht sicher, wie Sie diese mit dem ItemTemplate und wie Sie Checkboxen erstellen und sie in der ItemTemplate platzieren.

Entschuldigung, wenn es eine unrichtige Frage ist .... Ich schätze jeden Rat!

Datatabelle Beispiel von Daten, die ich bekommen werde ... obwohl ich Ids auch für Rollen und Benutzer zurückgeben werde, die hier nicht gezeigt werden.

Table dt = neue Datentabelle(); Datacolumn dc = new Datacolumn();

 dc.DataType = Type.GetType("System.String"); 
     dc.ColumnName = "RepName"; 
     dt.Columns.Add(dc); 

     dc = new DataColumn(); 
     dc.DataType = Type.GetType("System.Boolean"); 
     dc.ColumnName = "Caller"; 
     dt.Columns.Add(dc); 

     dc = new DataColumn(); 
     dc.DataType = Type.GetType("System.Boolean"); 
     dc.ColumnName = "closer"; 
     dt.Columns.Add(dc); 

     dc = new DataColumn(); 
     dc.DataType = Type.GetType("System.Boolean"); 
     dc.ColumnName = "Admin"; 
     dt.Columns.Add(dc); 

     dc = new DataColumn(); 
     dc.DataType = Type.GetType("System.Boolean"); 
     dc.ColumnName = "SuperUser"; 
     dt.Columns.Add(dc); 


     DataRow row; 

     row = dt.NewRow(); 

     row["RepName"] = "Joe"; 
     row["Caller"] = true; 
     row["closer"] = false; 
     row["Admin"] = true; 
     row["SuperUser"] = false; 
     dt.Rows.Add(row); 

     row = dt.NewRow(); 

     row["RepName"] = "Bob"; 
     row["Caller"] = true; 
     row["closer"] = false; 
     row["Admin"] = true; 
     row["SuperUser"] = false; 
     dt.Rows.Add(row); 


     row = dt.NewRow(); 

     row["RepName"] = "Tom"; 
     row["Caller"] = true; 
     row["closer"] = false; 
     row["Admin"] = true; 
     row["SuperUser"] = false; 
     dt.Rows.Add(row); 

Antwort

6

Verwendung verschachtelten Wiederholer: der äußere Repeater ist für Reihen und hat eine Header und ItemTemplate, die für Kopf- und Checkbox inneren Wiederholer enthalten Spalten jeweils. Etwas wie folgt aus:

<asp:Repeater runat="server" ID="rowRepeater" OnItemDataBound="rowRepeater_ItemBound"> 
    <HeaderTemplate> 
     <table>         
     <tr> 
      <asp:Repeater runat="server" ID="headerRepeater"> 
       <ItemTemplate> 
        <th> 
         <%# Container.DataItem %> 
        </th> 
       </ItemTemplate> 
      </asp:Repeater> 
     </tr> 
    </HeaderTemplate> 
    <ItemTemplate> 
     <tr> 
      <td><asp:Label runat="server" ID="lblUserName" Text='<%# Eval("Key") %>' /></td> 
      <asp:Repeater runat="server" ID="columnRepeater"> 
       <ItemTemplate> 
        <td> 
         <asp:HiddenField runat="server" ID="hfRoleIndex" Value='<%# Container.ItemIndex %>' /> 
         <asp:CheckBox runat="server" ID="cbColumnValue" Checked='<%# Container.DataItem %>' OnCheckedChanged="cbColumnValue_CheckedChanged" AutoPostBack="true" /> 
        </td> 
       </ItemTemplate> 
      </asp:Repeater> 
     </tr> 
    </ItemTemplate> 
    <FooterTemplate> 
     </table> 
    </FooterTemplate> 
</asp:Repeater> 

und im Code hinter:

Dictionary<string, bool[]> userRoles = new Dictionary<string, bool[]>(){ 
    {"Bob", new bool[]{true,true,false,false}}, 
    {"Tim",new bool[]{false,false,true,true}}, 
    {"John",new bool[]{false,true,false,true}} 
}; 

string[] headings = { "Rep Name", "Caller", "Closer", "Manager", "SuperUser" }; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     rowRepeater.DataSource = userRoles; 
     rowRepeater.DataBind(); 
    } 
} 

protected void rowRepeater_ItemBound(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Header) 
    { 
     Repeater headerRepeater = e.Item.FindControl("headerRepeater") as Repeater; 
     headerRepeater.DataSource = headings; 
     headerRepeater.DataBind(); 
    } 
    else if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    { 
     Repeater columnRepeater = e.Item.FindControl("columnRepeater") as Repeater; 
     columnRepeater.DataSource = ((KeyValuePair<string, bool[]>)e.Item.DataItem).Value; 
     columnRepeater.DataBind(); 
    } 
} 

protected void cbColumnValue_CheckedChanged(object sender, EventArgs e) 
{ 
    CheckBox cb = sender as CheckBox; 
    HiddenField hf = cb.Parent.FindControl("hfRoleIndex") as HiddenField; 
    int roleIndex = int.Parse(hf.Value); // now you have the column identifier 

    Label lbl = cb.Parent.Parent.Parent.FindControl("lblUserName") as Label; 
    string userName = lbl.Text; //now you have the row identifier 

    //now you can update your data source 
    userRoles[userName][roleIndex] = cb.Checked; 
} 
+0

Beispiel wäre großartig! – sdmiller

+0

Vielen Dank, werde ich, dass ein Schuss! – sdmiller

+0

Schnelle Frage ... Ich muss ein Oncheck-Ereignis hinzufügen, also rufen Sie eine Methode in Code hinter. Wenn ich das tue, sehen alle Checkboxen gleich aus ... Gibt es eine gute Möglichkeit zu sagen, welche überprüft wurde ... kann die ID der Header-Rolle an die Checkbox irgendwie binden. Anrufer ID = 1 näher ID = 2 ect ... Sie kommen aus einer Tabelle natürlich, aber Sie bekommen die Idee. Danke für deine Hilfe ... das war bisher großartig! – sdmiller

0

Ich werde so etwas wie dies versuchen:

<asp:GridView ID="OrdersGV" runat="server" AutoGenerateColumns="False"> 
<Columns> 
    <asp:BoundField DataField="UserName" /> 
    <asp:TemplateField> 
    <ItemTemplate> 
     <asp:ListView ID="NewsLV" runat="server"> 
     <ItemTemplate> 
      <td id="Td1" runat="server" valign="top" style="width: 30px;"> 
      <asp:Label ID="Label1" runat="server" Text='<%# Eval("RoleName") %>' Visible='<%# Container.DataItemIndex == 0%>'></asp:Label> 
      <div style="padding: 2px;"> 
       <asp:CheckBox ID="CheckBox1" runat="server" Checked='<%# Eval("IsRoleSelected") %>' /> 
      </div> 
      </td> 
     </ItemTemplate> 
     <LayoutTemplate> 
      <table id="Table1" runat="server" border="0" style=""> 
      <tr id="itemPlaceholderContainer" runat="server"> 
       <td id="itemPlaceholder" runat="server"> 
       </td> 
      </tr> 
      </table> 
     </LayoutTemplate> 
     </asp:ListView> 
    </ItemTemplate> 
    </asp:TemplateField> 
</Columns> 

+0

Leider mein Manager uns nicht will, Gridviews verwenden. Es ist scheiße, weil ich mehr Erfahrung mit ihnen habe. – sdmiller