我有一个ASP.Net detailsview控件。它的DataSourceId有所不同,我在Page_load中相应地设置它...(基于LLBLgen子类型,但这不是太重要)
我想这是一个页面生命周期leaky abstraction我没有“得到”。
问题是我绑定到可能存在或不存在的字段,具体取决于数据源...
要在某些条件下“禁用”绑定字段,我已经尝试将绑定字段包装在我在代码隐藏中设置为可见或不可见的面板中,但我仍然会收到以下错误:
Sys.WebForms.PageRequestManagerServerErrorException:DataBinding:Entity不包含名为“FilePrefix”的属性。
我在pageload中更改了detaislview.datasourceid ...在生命周期中可能为时已晚。
我不想绑定到该字段,因为新数据源不存在,但它尝试这样做,并且我得到了错误。
有什么想法吗? ;)
[已编辑]:按要求编码...
ASP,detailsview bound column:
<asp:TemplateField>
<ItemTemplate>
<asp:Panel ID="pnlNormalAdditionalFields" runat="server" Visible="false">
<asp:textbox id="txtFilePrefix" runat="server" MaxLength="250" Width="180px" text='<%# Bind("FilePrefix") %>'></asp:textbox>
<asp:requiredfieldvalidator id="valFilePrefix" runat="server" errormessage="File Prefix is required." controltovalidate="txtFilePrefix">*</asp:requiredfieldvalidator>
</asp:Panel>
</ItemTemplate>
</asp:TemplateField>
代码隐藏:(确定数据源,只有在初始页面加载时显示网格时,才能在回发时看到detaislview。)
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack) //initial load
{
}
else //postback
{
//set customdatasource for grid & detailsview
switch (radAccountType.SelectedValue)
{
case "Normal":
dvAccount.DataSourceID = "NormalCollectionDataSource";
AccountRadGrid.customDataSourceId = "NormalCollectionDataSource";
break;
case "Reseller":
dvAccount.DataSourceID = "ResellerCollectionDataSource";
AccountRadGrid.customDataSourceId = "ResellerCollectionDataSource";
break;
...
显示/隐藏面板:
protected void dvAccount_OnPreRender(object sender, EventArgs e)
{
Panel pnlGroupStoreAdditionalFields = ControlHelper.FindControlFromTop(this, "pnlGroupStoreAdditionalFields", null) as Panel;
pnlGroupStoreAdditionalFields.Visible = false;
switch (radAccountType.SelectedValue)
{
...
case "GroupStore":
ddlAccountType.SelectedValue = Constants.Account.Type.GroupStore;
pnlGroupStoreAdditionalFields.Visible = true;
break;
}
}
}
答案 0 :(得分:1)
您无法指定&lt;%#Bind(“”)%&gt;如果该字段不存在则声明;如果值可能存在或不存在,则必须使用programmbly从代码隐藏中分配值...使用findcontrol从特定项中查找控件。