ListView DataItem显示Null

时间:2009-03-04 04:52:59

标签: c# asp.net listview

几天前,我wrote about issues在ASP.NET中实现了ListView。现在,在编写了所有其他代码的情况下,我无法在ListView中保存更改的项目。

注意事项:

  • “保存”按钮不属于ListView;它调用GetListViewItems()方法,后者又调用Save()方法。
  • 按下按钮请求更新记录时调用Listview.DataBind()事件
  • Listview使用<%#Eval("Key.Name") %>named 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
     }
}

DataBinding ListView

数据绑定ListView的代码是shown here in my previous question

问题(S):

  1. 为什么当我遍历ListViewDataItem Listview中的每个项目null时?
  2. 如何从词典中检索Foo.Id
  3. 我还缺少什么?
  4. 如果我想根据显示的项目以编程方式获取Id,我会使用什么?就像现在一样,当前ListView基于选择的Foo来显示。然后会显示所选的Foo个,用户可以更改Bar中的DropDownList,点击保存,然后传播这些更改。

  5. 更新

    事实证明,我的问题是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 from my previous post来确定正在查看哪个Foo。

    对此方法的任何批评以及使其更好的方法都非常感谢。

2 个答案:

答案 0 :(得分:12)

一些快速回答:

  1. 您需要使用数据绑定才能工作,换句话说,分配给DataSource并致电DataBind()。编辑:似乎你正在这样做。但请记住,它不会在回发之间持续存在,只有DataKey(见下文)。

  2. 如果我没记错,您需要指定DataKeyNames,然后可以从DataKey属性中检索它们。

答案 1 :(得分:6)

您也可以使用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
}