Привязка DropDownList в ListView InsertItemTemplate вызывает ошибку - PullRequest
6 голосов
/ 22 января 2009

У меня есть ListView, который привязывается к LinqDataSource и отображает выбранные местоположения. Элемент вставки Содержит раскрывающийся список, извлекаемый из другого источника LinqDataSource, чтобы указать все невыбранные местоположения.

Проблема в том, что я получаю следующую ошибку при загрузке страницы:

Методы привязки данных, такие как Eval (), XPath () и Bind (), могут использоваться только в контексте элемента управления с привязкой к данным.

Я делаю очень похожую настройку на другой странице веб-сайта, и она не дает нам этой ошибки, поэтому я довольно запутался. Я знаю, что могу обойти это, не связываясь, вручную находя элемент управления и получая значение, но это должно сработать, и я не понимаю, почему это не так.

Есть мысли?

Лучшая часть исходного кода приведена ниже.

<asp:LinqDataSource ID="ldsLocations" runat="server" 
    ContextTypeName="ClearviewInterface.ESLinqDataContext" EnableDelete="true" EnableInsert="true"
    OnInserting="ldsLocations_Inserting" OnDeleting="ldsLocations_Deleting" 
    TableName="crmLocations" OrderBy="addr1" OnSelecting="ldsLocations_Selecting" />

<asp:LinqDataSource ID="ldsFreeLocations" runat="server" 
    ContextTypeName="ClearviewInterface.ESLinqDataContext" OrderBy="addr1" 
    TableName="v_CVLocations" OnSelecting="ldsFreeLocations_Selecting" />

<asp:ListView ID="lvLocations" DataSourceID="ldsLocations" DataKeyNames="ID" InsertItemPosition="LastItem" runat="server" >

<InsertItemTemplate>
        <tr>
            <td colspan="6"><hr /></td>
        </tr>
        <tr>
            <td colspan="2">

                <asp:DropDownList    ID="ddlFreeLocations" DataSourceID="ldsFreeLocations" DataTextField="addr1" 
                                        DataValueField="record" MarkFirstMatch="true" SelectedValue='<%# Bind("record") %>' 
                                        runat="server" />
            </td>
            <td><asp:ImageButton ID="btnAdd" CommandName="Insert" SkinID="Insert" runat="server" /></td>
        </tr>

    </InsertItemTemplate>

Ответы [ 7 ]

5 голосов
/ 10 июля 2009

Как объяснено в Блог Joteke , здесь приведено цитируемое решение.

Используете ли вы выражение <%#Eval("field")%> для привязки элемента управления? Если Вы измените это на <%#DataBinder.Eval(Container.DataItem,"field")%>, это, кажется, исправить ошибку?

2 голосов
/ 10 марта 2009

Взгляните на эту тему http://forums.asp.net/t/1187425.aspx

По сути, вы не можете использовать синтаксис Bind, потому что элементы управления внутри InsertItemTemplate являются «односторонними». Используйте код для получения значений.

1 голос
/ 05 декабря 2013

это будет работать

 protected void lstCompContctPerson_ItemCreated(object sender, RadListViewItemEventArgs e)
        {

        if ((e.Item != null) && (e.Item.ItemType == RadListViewItemType.InsertItem))
        {
            System.Web.UI.Control ddlCompNames = e.Item.FindControl("ddlCompNames");

           (ddlCompNames as RadDropDownList).DataSource = (from _company in objshortcut.GetAllCompanies()
            select new
            {
                  CompanyID = _company.CompanyID,
                  CompContctName = _company.CompanyName
             }).Distinct();

        }
    }
1 голос
/ 01 ноября 2012

Для такого сценария мы можем рассмотреть следующие разрешения:

  1. Для внутренних вложенных элементов управления вместо привязки данных мы используем другие методы для заполнения его элементов. Например, мы можем использовать цикл for для добавления элементов в выпадающий список вместо привязки данных. Таким образом, выражение <% # ...%> не будет оцениваться.

  2. Мы также можем выполнить изменение элемента управления DetailsView контейнера. Вместо выражения <% #%> мы можем вручную использовать какое-то событие, например «RowDataBound», чтобы заполнить элемент данных определенным внутренним элементом управления. А когда выполняете обновление / вставку, вручную извлекайте значения из элементов управления в нужном событии (например, ItemUpdating или ItemInserting ...).

Источник: http://blogs.msdn.com/b/stcheng/archive/2009/01/15/aspnet-system-invalidoperationexception-databinding-methods-such-as-eval-xpath-and-bind-can-only-be-used-in-the-context-of-a-databound-control-error-in-nested-databinding-scenario.aspx

0 голосов
/ 27 сентября 2011

С #Eval, возможно, стоит использовать DataBinder.Eval (), чтобы связывание происходило в нужное время.

0 голосов
/ 27 сентября 2011

Мне это удалось. У меня есть Formview с SqlDataSource и в представлении формы есть раскрывающийся список с SQLdataSource.

Когда запрашивается новая запись, я повторно выдаю команды выбора для обоих источников данных - источник раскрывающегося списка предоставляет список опций, а источник данных formview ничего не возвращает.

Затем я использую DataBind () как в форме, так и в раскрывающемся списке, и все хорошо.

Я новичок в ASP.Net, но это работает для меня и позволяет мне делать то, что я хочу - используйте Bind в раскрывающемся списке и текстовые поля в форме просмотра

Надеюсь, это поможет Nathan

0 голосов
/ 22 апреля 2009

У меня была похожая проблема. Попробуйте использовать #Eval вместо, если вы не обновляете значение этого поля.

...