Привязка DropDownList к EntityDataSource в EditItemTemplate GridView - PullRequest
0 голосов
/ 10 января 2012

Есть много вопросов, касающихся этой проблемы, но я не верю, что какой-либо адрес моей конкретной проблемы. У меня есть EntitySet, который редактируется через сетку. Это показывает нормально. Тем не менее, у меня есть два раскрывающихся списка, которые должны обрабатывать отношения внешнего ключа. Это работает в форме просмотра на той же странице для вставки. И в какой-то момент у меня это работало в режиме редактирования сетки.

Это в ASP.Net 3.5 (Entity Framework 1). Я использовал пример со страницы 286 книги Entity Framework Джулии Лерман (гл. 11).

Я получаю сообщение об ошибке: «Методы привязки данных, такие как Eval (), XPath () и Bind (), могут использоваться только в контексте элемента управления с привязкой к данным».

Большинство сообщений, которые я нахожу по этому поводу, относятся к Eval, а не к Bind. Код работает в режиме отображения (который Eval превращается в метку), но ошибка возникает при переключении в режим редактирования.

Любая помощь будет оценена. Дайте мне знать, если я смогу предоставить больше информации.

<asp:EntityDataSource
        ID="dsChargePrintMappings"
        ConnectionString="name=RateModelConnectionString"
        DefaultContainerName="RateEntities"
        EntitySetName="ChargePrintMappings"
        Include="ChargeType, BillPrintGroup"
        OrderBy="it.[EffectiveDate], it.[EffectiveEndDate]"
        EnableDelete="true"
        EnableUpdate="true"
        EnableInsert="true"
        runat="server" />

<asp:EntityDataSource
        ID="dsChargeType"
        ConnectionString="name=RateModelConnectionString"
        DefaultContainerName="RateEntities"
        EntitySetName="ChargeTypes"
        runat="server" />

    <asp:GridView
        ID="gvChargePrintMappings"
        DataSourceID="dsChargePrintMappings"
        DataKeyNames="Id"
        AutoGenerateColumns="false"
        runat="server">
        <AlternatingRowStyle CssClass="alternate" />
        <Columns>
            <asp:BoundField HeaderText="Id" ReadOnly="true" DataField="Id"
/>

            <asp:TemplateField HeaderText="Charge Type">
                <ItemTemplate>
                    <asp:Label ID="lbRate" Text='<%# Eval
("ChargeType.Description") %>' runat="server" />
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:DropDownList
                        ID="ddChargeType"
                        DataSourceId="dsChargeType"
                        DataTextField="Description"
                        DataValueField="Id"
                        SelectedValue='<%# Bind("ChargeType.Id") %>'
                        AppendDataBoundItems="True"
                        runat="server">
                        <asp:ListItem Selected="True" Value="">(none)</asp:
ListItem>
                     </asp:DropDownList>
                </EditItemTemplate>
            </asp:TemplateField>

Позже на странице у меня есть вид формы, который работает со вставкой:

<asp:FormView ID="fvRate" DataSourceID="dsForm" DefaultMode="ReadOnly"
runat="server">
        <EmptyDataTemplate>
            <asp:Button ID="btnInsert" Text="Create New" CommandName="New"
runat="server" />
        </EmptyDataTemplate>
        <InsertItemTemplate>
            <asp:Label ID="lblEffectiveDate" Text="Effective Date:"
AssociatedControlID="txtEffectiveDate" runat="server" />
            <asp:TextBox ID="txtEffectiveDate" onfocus="$(this).datepicker ()" Text='<%# Bind("EffectiveDate") %>' runat="server" /><br>

            <asp:Label ID="lblEffectiveEndDate" Text="Effective End Date:"
AssociatedControlID="txtEffectiveEndDate" runat="server" />
            <asp:TextBox ID="txtEffectiveEndDate" onfocus="$ (this).datepicker()" Text='<%# Bind("EffectiveEndDate") %>' runat="server"
/><br>

            <asp:Label ID="lblChargeType" Text="Charge Type:"
AssociatedControlID="ddChargeType" runat="server" />
            <asp:DropDownList
                ID="ddChargeType"
                DataSourceId="dsChargeType"
                DataTextField="Description"
                DataValueField="Id"
                SelectedValue='<%# Bind("ChargeType.Id") %>'
                AppendDataBoundItems="True"
                runat="server">
                <asp:ListItem Selected="True" Value="">(none)</asp:ListItem
>
             </asp:DropDownList><br>

            <asp:Label ID="lblBillPrintGroup" Text="Bill Print Group:"
AssociatedControlID="ddBillPrintGroup" runat="server" />
            <asp:DropDownList
                ID="ddBillPrintGroup"
                DataSourceId="dsBillPrintGroup"
                DataTextField="Description"
                DataValueField="Id"
                SelectedValue='<%# Bind("BillPrintGroup.Id") %>'
                AppendDataBoundItems="True"
                runat="server">
                <asp:ListItem Selected="True" Value="">(none)</asp:ListItem
>
             </asp:DropDownList><br>


            <asp:Button ID="btnInsert" CommandName="Insert" Text="Create"
runat="server" />
            <asp:Button ID="btnCancelUpdate" CommandName="Cancel" Text ="Cancel" runat="server" />
        </InsertItemTemplate>
    </asp:FormView>

Ответы [ 2 ]

1 голос
/ 10 января 2012

воссоздавая мой комментарий в ответ, чтобы я мог отформатировать: просто для справки, я открыл соответствующий образец из этой книги (1-е издание и образец 3,5, поэтому для его запуска используется VS2008).У меня не было проблем с редактированием и сохранением значения в раскрывающемся списке, который использует:

<asp:TemplateField HeaderText="PrimaryActivity" SortExpression="PrimaryActivity">
  <EditItemTemplate>
    <asp:DropDownList runat="server" ID="act1DDL" 
         DataTextField="ActivityName" 
         DataValueField="ActivityID" 
         DataSourceID="EntityDataSource5" 
         AppendDataBoundItems="True" 
         SelectedValue='<%# Bind("PrimaryActivity.ActivityID") %>'>
        <asp:ListItem Value="">*</asp:ListItem>
     </asp:DropDownList>
  </EditItemTemplate>
  <ItemTemplate>
      <asp:Label ID="Label1" runat="server" 
                 Text='<%# Bind("PrimaryActivity.ActivityName") %>'></asp:Label>
  </ItemTemplate>
</asp:TemplateField>

Я знаю, что «работает на моем компьютере» не очень полезно, но происходит что-то еще.Может быть, эта ссылка, которую я отправил вам через твиттер, может быть полезной?

http://aspadvice.com/blogs

0 голосов
/ 18 января 2012

Оказалось, что проблема с FormView (и его DataSource), привязанным к Grid.Я оставил в параметре Id, поступающем из SelectedValue GridView, но, поскольку GridView был редактируемым, у него были проблемы при попытке связать запись двумя редактируемыми способами.

Если говорить точнее, мне нужно было удалить атрибут DataKeyNames из GridView и любые параметры в источнике данных FormView, которые ссылались на GridView.

Поскольку FormView тогда использовался только для вставки, это должен был быть режим по умолчанию, чтобы он был видимым.EmptyItemTemplate не был виден, когда не было привязки к GridView, поэтому я использовал кнопку и jquery-ui, чтобы скрыть и показать вид формы (который всегда был в режиме вставки).

...