中继器,并添加列标题和ItemTemplate中在页面加载 [英] Repeater and add columns to header and itemtemplate on page load
问题描述
我没有使用中继器更不是显示从数据表的数据。
我建立一个网格,显示角色的用户已被分配,使用复选框显示的用户和列的列表(显示为真/低于假,但pretent他们复选框)。
恩。
|众议员名称|来电|建立更紧密|经理|超级用户|
|鲍勃            |真|真   |假      |假|
|汤姆          |虚假  |假  |真      |真|
基本上使用它的角色管理。
然而,角色可能,所以我想给角色(标题和项目)动态地加载到中继器以后更改。
我不知道如何做到这一点,或者如果它甚至有可能。
我想你抓住当前角色的可能性列表,并将它们加载到HeaderTemplate中,但我不知道如何使用的ItemTemplate匹配,以及如何创建复选框,并把它们在ItemTemplate。
很抱歉,如果它是一个rudementary问题....我AP preciate任何意见!
这是我要得到...虽然我也会为这里没有显示角色和用户返回IDS数据的DataTable的例子。
DataTable的DT =新的DataTable();
DataColumn的DC =新的DataColumn();
dc.DataType = Type.GetType(System.String);
dc.ColumnName =RepName;
dt.Columns.Add(DC); DC =新的DataColumn();
dc.DataType = Type.GetType(System.Boolean);
dc.ColumnName =来电;
dt.Columns.Add(DC); DC =新的DataColumn();
dc.DataType = Type.GetType(System.Boolean);
dc.ColumnName =更近;
dt.Columns.Add(DC); DC =新的DataColumn();
dc.DataType = Type.GetType(System.Boolean);
dc.ColumnName =管理;
dt.Columns.Add(DC); DC =新的DataColumn();
dc.DataType = Type.GetType(System.Boolean);
dc.ColumnName =超级用户;
dt.Columns.Add(DC);
DataRow的排; 行= dt.NewRow(); 行[RepName] =乔;
行[来电] =真;
行[接近] = FALSE;
行[管理] =真;
行[超级用户] = FALSE;
dt.Rows.Add(行); 行= dt.NewRow(); 行[RepName] =鲍勃;
行[来电] =真;
行[接近] = FALSE;
行[管理] =真;
行[超级用户] = FALSE;
dt.Rows.Add(行);
行= dt.NewRow(); 行[RepName] =汤姆;
行[来电] =真;
行[接近] = FALSE;
行[管理] =真;
行[超级用户] = FALSE;
dt.Rows.Add(行);
使用嵌套中继器:外直放站是行,有一个HeaderTemplate中和ItemTemplate中分别包含标题和列复选框内转发器。事情是这样的:
< ASP:直放站=服务器ID =rowRepeaterOnItemDataBound =rowRepeater_ItemBound>
<&HeaderTemplate中GT;
<表>
&所述; TR>
< ASP:直放站=服务器ID =headerRepeater>
<&ItemTemplate中GT;
<第i个
<%#的Container.DataItem%GT;
< /第i
< / ItemTemplate中>
< / ASP:直放站>
< / TR>
< / HeaderTemplate中>
<&ItemTemplate中GT;
&所述; TR>
< TD>< ASP:标签=服务器ID =lblUserName文本='<%#的eval(密钥)%GT;' />< / TD>
< ASP:直放站=服务器ID =columnRepeater>
<&ItemTemplate中GT;
&所述; TD>
< ASP:HiddenField =服务器ID =hfRoleIndex值='<%#Container.ItemIndex%GT;' />
< ASP:复选框=服务器ID =cbColumnValue选中='<%#的Container.DataItem%GT;' OnCheckedChanged =cbColumnValue_CheckedChanged的AutoPostBack =真/>
< / TD>
< / ItemTemplate中>
< / ASP:直放站>
< / TR>
< / ItemTemplate中>
< FooterTemplate>
< /表>
< / FooterTemplate>
< / ASP:直放站>
和在你的code背后:
词典<字符串,布尔[]> =的UserRole新字典<字符串,布尔[]>(){
{鲍勃,新布尔[] {真,真,假,假}},
{添新布尔[] {假的,假的,真正的,真实}},
{约翰,新布尔[] {假,真,假,真}}
};字符串[] =标题{代表姓名,来电,偷心,经理人,超级用户};保护无效的Page_Load(对象发件人,EventArgs的发送)
{
如果(!Page.IsPostBack)
{
rowRepeater.DataSource =的UserRole;
rowRepeater.DataBind();
}
}保护无效rowRepeater_ItemBound(对象发件人,RepeaterItemEventArgs E)
{
如果(e.Item.ItemType == ListItemType.Header)
{
中继headerRepeater = e.Item.FindControl(headerRepeater)作为中继器;
headerRepeater.DataSource =标题;
headerRepeater.DataBind();
}
否则,如果(e.Item.ItemType == || ListItemType.Item == e.Item.ItemType ListItemType.AlternatingItem)
{
中继columnRepeater = e.Item.FindControl(columnRepeater)作为中继器;
columnRepeater.DataSource =((KeyValuePair<字符串,布尔[]>)e.Item.DataItem).value的;
columnRepeater.DataBind();
}
}保护无效cbColumnValue_CheckedChanged(对象发件人,EventArgs的发送)
{
复选框CB =发件人为复选框;
HiddenField HF = cb.Parent.FindControl(hfRoleIndex)作为HiddenField;
INT roleIndex = int.Parse(hf.Value); //现在你有列标识符 标签LBL = cb.Parent.Parent.Parent.FindControl(lblUserName)作为标签;
字符串username = lbl.Text; //现在你有行标识符 //现在你可以更新数据源
的UserRole [用户名] [roleIndex] = cb.Checked;
}
I haven't used repeaters for much more than showing data from a datatable.
I am building a grid that that shows a list of users and columns of roles that the user has been assigned, shown with checkboxes (shown with true/false below but pretent they are checkboxes).
ex.
|Rep Name|Caller|Closer|Manager|SuperUser|
|Bob |True |true | false | false |
|Tom |false |false |True | True |
Basically using it for roles management.
However the roles may change later on so I want to load the roles(headers and items) dynamically into the repeater.
I am not sure how to do this or if it is even possible.
I figure you grab a list of current role possibilities and load them into the headertemplate but I am not sure how to match those with the itemtemplate and how to create checkboxes and place them in the itemtemplate.
Sorry if it is a rudementary question.... I appreciate any advice!
Datatable example of data that I am going to get... though I will also return ids for roles and users that are not shown here.
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);
Use nested Repeaters: the outer Repeater is for rows and has a HeaderTemplate and ItemTemplate which contain inner Repeaters for header and checkbox columns respectively. Something like this:
<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>
and in your code behind:
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;
}
这篇关于中继器,并添加列标题和ItemTemplate中在页面加载的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!