转发器并在页面加载时向列和itemtemplate添加列

我没有使用中继器比显示数据表中的数据更多。

我正在构建一个网格,其中显示了用户已分配的用户和角色列,显示了复选框(在下面显示为true / false,但它们是复选框)。

恩。

| Rep名称|来电者|更接近|经理|超级用户|
| Bob | True | true | 假| 假|
| Tom | false | false | True | 真的

基本上用它来进行角色管理。

但是,角色可能会在以后更改,因此我希望将角色(标题和项目)动态加载到转发器中。

我不知道该怎么做或者甚至可能。

我想你抓住当前角色可能性的列表并将它们加载到headertemplate但是我不确定如何将它们与itemtemplate匹配以及如何创建复选框并将它们放在itemtemplate中。

对不起,如果这是一个粗鲁的问题……我很感激任何建议!

我将获得的数据的数据示例…虽然我也将返回此处未显示的角色和用户的ID。

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

使用嵌套的Repeater:外部Repeater用于行,并且有一个HeaderTemplate和ItemTemplate,它们分别包含header和checkbox列的内部Repeater。 像这样的东西:

     
<%# Container.DataItem %>

并在您的代码后面:

 Dictionary userRoles = new Dictionary(){ {"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)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; } 

我会尝试这样的事情: