Вопрос

Несколько дней назад я писал о проблемах с реализацией 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были выбраны.Те Fooзатем отображаются выбранные параметры, и пользователь может изменить Bar в DropDownList, нажмите «Сохранить», и эти изменения будут применены.

Обновлять

Как выяснилось, моя проблема заключалась в том, что Леппи сказал;и это было то, что мне нужно было указать 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 смотрели.

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

Это было полезно?

Решение

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

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

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

Другие советы

вы также можете использовать свойство 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
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top