ListView DataItem показывает нулевой - PullRequest
19 голосов
/ 04 марта 2009

Несколько дней назад я написал о проблемах с реализацией ListView в ASP.NET. Теперь, когда весь остальной код написан, у меня возникли проблемы с сохранением измененных элементов в ListView.

Несколько замечаний:

  • Кнопка Сохранить не является частью самого ListView; он вызывает метод GetListViewItems(), который в свою очередь вызывает метод Save().
  • Событие Listview.DataBind() вызывается при нажатии кнопки, запрашивающей обновление записей
  • В Listview отображается текст с использованием <%#Eval("Key.Name") %> и с именем DropDownList с использованием <%#Eval("Value") %>

Получение элементов из ListView

public void GetListViewItems()
{
 List<Foo> Result = FooManager.CreateFooList();
 DropDownList ddl = null;
 ListViewItem Item = null;
    try
      {
       foreach (ListViewDataItem item in lvFooList.Items)
         {
          Item = item;
          ddl = ((DropDownList) (Item.FindControl("ddlListOfBars")));
          if (//something is there)
           {
            Foo foo = FooManager.CreateFoo();
            foo.Id = item.DataItemIndex; //shows null
            int barId = int.Parse(ddl.SelectedItem.Value); //works just fine
            foo.barId = barId;
            Result.Add(foo);
           }
         }
      }
   catch (Exception ex)
     {
             //Irrelevant for our purposes
     }
}

Привязка данных к ListView

Код для привязки данных к ListView: , показанный здесь в моем предыдущем вопросе .

Вопрос (ы):

  1. Почему при выполнении итераций по ListViewDataItem в Listview каждый элемент равен null?
  2. Как я могу получить Foo.Id из словаря?
  3. Что еще я мог упустить?
  4. Что бы я использовал, если бы хотел получить это Id Программно на основе того, какие предметы были показаны? Как и сейчас, текущий ListView отображается в зависимости от того, какие Foo s были выбраны. Затем отображаются выбранные Foo, и пользователь может изменить Bar в DropDownList, нажать Сохранить, и эти изменения распространяются.

Обновление

Как оказалось, моя проблема заключалась в том, что сказал leppie ; и это было то, что мне нужно было указать DataKeyNames и использовать их для сохранения информации из ListView.

Вот код, который я добавил:

try
{
   int DataKeyArrayIndex = 0;
   foreach (ListViewDataItem item in lvFooList.Items)
     {
      Item = item;
      ddl = ((DropDownList) (Item.FindControl("ddlListOfBars")));
      if (//something is there)
       {
        Foo foo = FooManager.CreateFoo();
        Foo tempFoo = FooManager.CreateFoo();
        if (lvFooList != null)
        {
             tempFoo = ((Foo)(lvFooList.DataKeys[DataKeyArrayIndex].Value));
        }

        foo.Id = tempFoo.Id;
        int barId = int.Parse(ddl.SelectedItem.Value); //works just fine
        foo.barId = barId;
        Result.Add(foo);
        DataKeyArrayIndex++;
     }
   }
}

А потом в файл .ascx я добавил DataKeyNames="Key", вот так:

<asp:ListView ID="lvFooList" runat="server" DataKeyNames="Key">

Это позволило мне использовать Key из моего предыдущего поста , чтобы определить, на какого Foo смотрят.

Любая критика этого подхода, а также методы его совершенствования приветствуются.

Ответы [ 2 ]

12 голосов
/ 04 марта 2009

Несколько быстрых ответов:

  1. Вам необходимо использовать привязку данных для этого, другими словами, назначить DataSource и вызвать DataBind(). РЕДАКТИРОВАТЬ: кажется, вы делаете это. Но помните, что он не будет сохраняться между постбэками, только DataKey (см. Ниже).

  2. Если я правильно помню, вам нужно указать DataKeyNames, и тогда их можно получить из свойства DataKey.

6 голосов
/ 19 мая 2009

вы также можете использовать свойство ListViewDataItem.DataItemIndex вместо хранения своего собственного индекса, как в:

foreach (ListViewDataItem item in MyListView.Items)
{
    // in this example key is a string value
    Foo foo = new Foo(MyListView.DataKeys[item.DataItemIndex].Value as string);

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