2010-04-30 28 views
5

Tôi đã không sử dụng bộ lặp nhiều hơn là hiển thị dữ liệu từ một dữ liệu có thể đặt.Lặp lại và thêm cột vào tiêu đề và itemtemplate khi tải trang

Tôi đang xây dựng một lưới hiển thị danh sách người dùng và cột vai trò mà người dùng đã được chỉ định, được hiển thị với hộp kiểm (được hiển thị đúng/sai bên dưới nhưng giả vờ là hộp kiểm).

ví dụ:

| Tên đại diện | Người gọi | Gần hơn | Người quản lý | Siêu người dùng |
| Bob                       | Đúng | đúng     | false           | sai |
| Tom                   | sai   | sai   | Đúng           | Đúng |

Về cơ bản sử dụng nó để quản lý vai trò.

Tuy nhiên, vai trò có thể thay đổi sau đó vì vậy tôi muốn tải các vai trò (tiêu đề và mục) động vào bộ lặp.

Tôi không chắc chắn cách thực hiện điều này hoặc thậm chí nếu có thể.

Tôi tìm bạn lấy danh sách các khả năng vai trò hiện tại và tải chúng vào bảng điều khiển đầu nhưng tôi không chắc chắn làm thế nào để khớp với những mục có itemtemplate và cách tạo hộp kiểm và đặt chúng trong itemtemplate.

Xin lỗi nếu đó là câu hỏi sơ lược .... Tôi đánh giá cao mọi lời khuyên!

Ví dụ về dữ liệu có thể chia sẻ mà tôi sẽ nhận được ... mặc dù tôi cũng sẽ trả lại id cho vai trò và người dùng không được hiển thị ở đây.

DataTable dt = new DataTable(); 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); 

Trả lời

6

Sử dụng bộ lặp lồng nhau: lặp bên ngoài là cho các hàng và có một HeaderTemplate và ItemTemplate có chứa lặp bên trong cho header và hộp kiểm cột tương ứng. Một cái gì đó như thế này:

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

và trong mã của bạn đằng sau:

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

Ví dụ sẽ tuyệt vời! – sdmiller

+0

Cảm ơn rất nhiều, tôi sẽ cho rằng một shot! – sdmiller

+0

Câu hỏi nhanh ... Tôi cần thêm sự kiện oncheck để gọi phương thức ở mã phía sau. Khi tôi làm điều này tất cả các hộp kiểm tra giống nhau ... Có cách nào tốt để nói cái nào đã được kiểm tra ... có thể ràng buộc id của vai trò tiêu đề vào hộp kiểm bằng cách nào đó không. Id người gọi = 1 gần hơn id = 2 vv ... chúng đến từ một bảng tất nhiên nhưng bạn có ý tưởng. Cảm ơn bạn đã giúp đỡ ... điều này đã được tuyệt vời cho đến nay! – sdmiller

0

Tôi sẽ cố gắng một cái gì đó như thế này:

<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

Đáng tiếc là quản lý của tôi không muốn chúng ta phải sử dụng gridviews. Nó hút bởi vì tôi có nhiều kinh nghiệm hơn với họ. – sdmiller

Các vấn đề liên quan