用户控件定义名为 UserCanEdit 的属性:
private bool _userCanEdit=false;
public bool UserCanEdit
{
get { return _userCanEdit; }
set { _userCanEdit = value; }
}
此用户控件还包含以下 GridView :
<asp:GridView ID="GridView1" runat="server">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Label ID="C" runat="server" Visible='<%# UserCanEdit %>' Text="Visibility"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
要使控件 C 可见, UserCanEdit 需要设置为 true 。如果我在 Page_Init()中设置它,那么 C 确实可见。但如果我在 Page_Load()中设置它,则 C 不可见:
protected void Page_Load(object sender, EventArgs e)
{
this.UserCanEdit = (this.Page.User.Identity.IsAuthenticated &&
(this.Page.User.IsInRole("Administrators") ||
this.Page.User.IsInRole("Editors")));
GridView1.DataBind();
}
那么,如果在Page_Load()中设置 UserCanEdit ,为什么 C 不可见?据我所知,仅在调用 GridView.DataBind()时才会评估单值绑定表达式&lt;%#%&gt; ,这发生在之后UserCanEdit 设置为 true ?!
欢呼声
答案 0 :(得分:2)
我的猜测是因为在您拥有UserCanEdit值之前正在定义控件。是否在页面初始化步骤中的Page_Load()之前加载控件?
答案 1 :(得分:1)
我想这里的问题是UserCanEdit不是gridview的数据源。如何根据不属于您的来源的财产进行绑定。我想你想要做的是你想根据一些用户凭证隐藏一列。可能的问题是用户OnRowDataBound事件。在那个事件用户里面就是这样的
如果(条件)
((Label)e.Row.FindControl("C")).visible = true;
否则
((Label)e.Row.FindControl("C")).visible = false;
现在您可以在实际的Page_Load(您的网页)事件中设置此编码。
注意:条件是与您的UserCanEdit类似的公共财产