Привязка данных в виде вложенного списка - свойство не найдено? - PullRequest
0 голосов
/ 24 апреля 2009

У меня есть просмотр списка, в котором я установил источник данных в коде - это отлично работает. Когда я добавляю другое представление списка (или элемент управления с привязкой к данным) к шаблону элемента списка и устанавливаю источник данных для этого элемента управления в кодовой области, поля, возвращаемые запросом, кажутся недоступными для вложенного списка; ASP.NET выдает следующую ошибку: Привязка данных: «System.String» не содержит свойство с именем «j_Name».

В приведенном ниже примере d_Description работает нормально, тогда как j_Role выдает ошибку, указанную выше. Я вижу данные, возвращаемые запросом, и знаю, что имена столбцов совпадают, так что является причиной ошибки (и как ее устранить)?

Страница ASPX

<asp:ListView ID="LV1" runat="server">
    <LayoutTemplate>
        <table runat="server" id="tblSummary">
            <tr runat="server" id="itemPlaceholder" />
        </table>
    </LayoutTemplate>
    <ItemTemplate>
        <tr>
            <td>
                <%#Eval("d_Description")%>
            </td>
        </tr>
        <tr>
            <td>
                <asp:ListView ID="LV2" runat="server">
                    <ItemTemplate>
                        <%#Eval("j_Role")%>
                    </ItemTemplate>
                    <LayoutTemplate>
                        <asp:placeholder id="itemPlaceholder" runat="server" />
                    </LayoutTemplate>
                </asp:ListView>
            </td>
        </tr>
    </ItemTemplate>
</asp:ListView>

Код позади

var qry1 = from q in context.Descriptions select q.d_Description;
LV1.DataSource = qualificationQry;
LV1.DataBind(); 

var qry2 = from q in context.Roles select q.j_Role;
LV2.DataSource = qualificationQry;
LV2.DataBind(); 

EDIT: Я добавил код, подобный приведенному ниже, в событие ItemDataBound внешнего списка, и все еще сталкиваюсь с той же ошибкой. Предположительно, я неправильно понимаю инструкцию?

protected void LV_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    using (dbDataContext context = new dbDataContext()
    {
        var qry2 = from q in context.Roles select q.j_Role;

        ListView tempLV = (ListView)e.Item.FindControl("LV2");
        tempLV.DataSource = qry2;
        tempLV.DataBind();
    }
}

РЕДАКТИРОВАТЬ: 2 После прочтения в Интернете еще (теперь, когда у меня есть представление о том, что искать) предложенный ответ кажется правильным - однако он не работает - может кто-нибудь подсказать почему?

РЕДАКТИРОВАТЬ: 3 Если я прерву вывод j_Name и просто получу жестко закодированную строку, ошибки не будет, и жестко закодированная строка выдаст ожидаемое количество раз. Это указывает на то, что это просто имя столбца (j_Name), которое неверно - хотя я вижу, что набор данных возвращается из запроса с таким точным именем столбца.

РЕДАКТИРОВАТЬ: 4 Починил это. Это не верно var qry2 = from q in context.Roles select q.j_Role; Это правильно var qry2 = from q in context.Roles select q;

1 Ответ

2 голосов
/ 24 апреля 2009

Вам необходимо привязать внутренний список к каждой строке внешнего списка в ItemDataBoundEvent для внешнего списка.

Итак, этот код:

var qry2 = from q in context.Roles select q.j_Role;
LV2.DataSource = qualificationQry;
LV2.DataBind();

нужно будет использовать четный обработчик для события внешних списков ItemDataBound:

protected void ContactsListView_ItemDataBound(object sender, ListViewItemEventArgs e)
{
  if (e.Item.ItemType == ListViewItemType.DataItem)
  {
    // Bind the inner list on every repeat of the outer list
    var qry2 = from q in context.Roles select q.j_Role;
    LV2.DataSource = qualificationQry;
    LV2.DataBind();
  }
}

И, вероятно, вы захотите отфильтровать значения для внутреннего списка на основе значения из текущего элемента внешнего списка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...