Словарь <T> списка <T> и ListViews в ASP.NET

Я также искал тот же ответ и как-то не мог понять концепцию ясно. Но, наконец, я понял это из этой ссылки

, это ключевое слово в Java. Который может использоваться внутри метода или конструктора класса. Он (это) работает как ссылка на текущий объект, метод которого или конструктор вызывается. это ключевое слово можно использовать для ссылки любого члена текущего объекта из метода экземпляра или конструктора.

Проверьте примеры в ссылке для ясного понимания

19
задан stevemegson 24 February 2009 в 23:54
поделиться

2 ответа

Ваша проблема возникает, потому что не имеет смысла связывать с данными ddlListOfBars в DataBindFooList (), потому что нет всего одного DropDownList для привязки данных. Когда Вы называете lv. DataBind (), ListView создает копию Вашего ItemTemplate для каждого Foo, каждый содержащий ddlListOfBars. Необходимо сказать этому связывать каждый DropDownList направо List< Bar> как это идет. Можно сделать это путем установки источника данных ddlListOfBars с выражениями привязки данных, а не в коде позади:

<ItemTemplate>
  <%#Eval("Key.Name") %>
  <asp:DropDownList
        ID="ddlListOfBars"
        runat="server"
        DataSource='<%#Eval("Value")%>'
        DataValueField="ItemValue"
        DataTextField="ItemName" />
</ItemTemplate>

Примечание, что также необходимо использовать "Ключ. Имя" для получения до свойства имени Foo. Отдельные объекты словаря, с которыми Вы связываете, являются KeyValuePair< Foo, List< Bar> > который имеет свойство Key и свойство Value для доступа к Foo и List< Bar> соответственно.

Редактирование
, Если у Вас есть большое продолжение в Вашем ItemTemplate тогда, может быть полезно выгнать содержание с квартиры в пользовательский элемент управления. Пользовательский элемент управления может иметь свойство со строгим контролем типов для доступа к DataItem и имеет доступ со строгим контролем типов к его дочерним элементам управления. Это получает Вас гибкость события ItemDataBound без весь кастинг и FindControl () шум. Я сомневаюсь, что обеспокоился бы в этом случае, но это пойдет что-то как

<asp:ListView ID="lvFooList" runat="server">
<LayoutTemplate>
  <asp:PlaceHolder runat="server" ID="itemPlaceholder"></asp:PlaceHolder>
</LayoutTemplate>
  <ItemSeparatorTemplate>
     <hr />
  </ItemSeparatorTemplate>
<ItemTemplate>
  <uc:ListViewContents DataItem='<%# Container.DataItem %>' />
</ItemTemplate>

ListViewContents.ascx...

<asp:Label ID="lbName" runat="server"/>
<asp:DropDownList ID="ddlListOfBars" runat="server"></asp:DropDownList>

ListViewContents.ascx.cs...

public KeyValuePair<Foo,List<Bar>> DataItem
{
    get; set;
}

protected override void OnDataBinding(EventArgs e)
{
    base.OnDataBinding(e);

    lbName.Text = DataItem.Key.Name;

    ddlListOfBars.DataTextField = "ItemName";
    ddlListOfBars.DataValueField = "ItemValue";
    ddlListOfBars.DataSource = DataItem.Value;
    ddlListOfBars.DataBind();   
}
9
ответ дан 30 November 2019 в 05:11
поделиться

Что-то вроде этого, что Вы хотите:

   <asp:ListView ID="lvFooList" runat="server">
    <LayoutTemplate>
      <asp:PlaceHolder runat="server" ID="itemPlaceholder"></asp:PlaceHolder>
    </LayoutTemplate>
      <ItemSeparatorTemplate>
         <hr />
      </ItemSeparatorTemplate>
    <ItemTemplate>
      <asp:Label ID="lbName" runat="server"/>
      <asp:DropDownList ID="ddlListOfBars" runat="server"></asp:DropDownList>
    </ItemTemplate>
   </asp:ListView>

Тогда я записал, что очень быстрый противный тест

    public class Foo
    {
        public string Name;
    }

    public class Bar
    {
        public string ItemName { get; set; }
        public string ItemValue { get; set; }
    }

    protected void Page_Load(object sender, EventArgs e)
    {

        var fooKey1 = new Foo() {Name = "foo1"};
        var barList1 = new List<Bar>()
               {
                   new Bar() {ItemName = "bar1", ItemValue = "barV1"},
                   new Bar() {ItemName = "bar2", ItemValue = "barV2"}
               };
        var fooKey2 = new Foo() {Name = "foo2"};
        var barList2 = new List<Bar>()
               {
                   new Bar() {ItemName = "bar3", ItemValue = "barV3"},
                   new Bar() {ItemName = "bar4", ItemValue = "barV4"}
               };

        var dicFooBar = new Dictionary<Foo, List<Bar>>() {{fooKey1, barList1}, {fooKey2, barList2}};

        lvFooList.ItemDataBound += lvFooList_ItemDataBound;
        lvFooList.DataSource = dicFooBar;
        lvFooList.DataBind();
    }

    void lvFooList_ItemDataBound(object sender, ListViewItemEventArgs e)
    {
        var dataItem = (ListViewDataItem)e.Item;
        var fooBarList = (KeyValuePair<Foo, List<Bar>>)dataItem.DataItem;

        ((Label) dataItem.FindControl("lbName")).Text = fooBarList.Key.Name;

        var ddlListOfBars = (DropDownList) dataItem.FindControl("ddlListOfBars");
        ddlListOfBars.DataTextField = "ItemName";
        ddlListOfBars.DataValueField = "ItemValue";
        ddlListOfBars.DataSource = fooBarList.Value;
        ddlListOfBars.DataBind();
    }

, Кажется, делает то, что Вы хотите, но мой код является просто быстрым тестовым кодом, так быть предупрежденным. Это действительно представляло как ожидалось все же.

4
ответ дан 30 November 2019 в 05:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: