【问题标题】:How to conditionally disable a detailsview databound field如何有条件地禁用详细信息视图数据绑定字段
【发布时间】:2010-05-19 12:30:53
【问题描述】:

我有一个 ASP.Net detailsview 控件。它的 DataSourceId 不同,我在 Page_load 中进行了相应的设置...(基于 LLBLgen 子类型,但这不是太重要)

我猜这是一个页面生命周期leaky abstraction我没有“得到”。

问题是我绑定到的字段可能存在也可能不存在,具体取决于数据源...

为了在某些条件下“禁用”绑定字段,我尝试将绑定字段包装在一个面板中,该面板在代码隐藏中设置为可见或不可见,但我仍然收到以下错误:

Sys.WebForms.PageRequestManagerServerErrorException:DataBinding:实体不包含名为“FilePrefix”的属性。

我在 pageload 中更改了 detaislview.datasourceid...在生命周期中可能为时已晚。

我不想绑定到该字段,因为新数据源不存在该字段,但它尝试这样做,但我得到了错误。

有什么想法吗? ;)

[已编辑]:按要求编写代码...

ASP,detailsview绑定栏:

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

    }

【问题讨论】:

  • 你能发布一些代码吗?

标签: asp.net datasource detailsview


【解决方案1】:

如果字段不存在,则不能分配 语句;如果值可能存在也可能不存在,您将不得不从代码隐藏中编程分配值...使用 findcontrol 从特定项目中查找控件。

【讨论】:

  • 怎么样? protected void SomeField_OnDataBinding(object sender, EventArgs e) { ((TextBox)sender).Text = Eval("SomeField").ToString();只有 Eval() 可用,Bind() 不可用。 Eval 是只读的,我需要能够将文本框中的值自动推送回数据库...就像
  • 好的,如果您需要自动回推,那么您需要确保该字段在两个数据源中都存在,即使它在另一个数据源中始终为空......这是唯一的方法我知道使用 DataSourceID。
  • 我会接受你的回答。我必须在 detailsview 的 OnItemInserting/Updating 事件中手动绑定......我有更多的控制权,并且可以禁用这种方式不需要的字段。
猜你喜欢
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多