質問

数日前、問題について書きました ASP.NETでListViewを実装します。さて、他のすべてのコードが書かれているので、変更されたアイテムをリストビューに保存するのに問題があります。

注意事項:

  • [保存]ボタンはListViewの一部ではありません。 GetListViewItems()メソッドを呼び出し、次にSave()メソッドを呼び出します。
  • レコードの更新を要求するボタンが押されると、Listview.DataBind()イベントが呼び出されます
  • リストビューには、<%#Eval("Key.Name") %> <= > DropDownList
  • を使用して

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. <%#Eval("Value") %>ListViewDataItemを繰り返し処理するときに、各項目がListviewであるのはなぜですか?
  2. 辞書からnullを取得するにはどうすればよいですか?
  3. 他に不足しているものはありますか?
  4. 表示されるアイテムに基づいてプログラムでFoo.Id取得したい場合、何を使用しますか?現在のように、現在のListViewは、選択されたIdに基づいて表示されます。選択されたそれらのFooが表示され、ユーザーはBarDataKeyNamesを変更し、保存を押すと、それらの変更が反映されます。

更新

判明したように、私の問題は leppie が言ったことでした。そして、それは.ascxを指定し、それらを使用して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++;
     }
   }
}

次に、DataKeyNames="Key"ファイルにKeyを追加しました。次のようになります。

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

これにより、以前の投稿の<=> を使用できましたで、どのFooが見られていたかを判断します。

このアプローチに対する批判、およびそれを改善する方法は大歓迎です。

役に立ちましたか?

解決

いくつかの簡単な回答:

  1. それを機能させるには、データバインディングを使用する必要があります。つまり、DataSourceに割り当ててDataBind()を呼び出します。編集:あなたはそれをしているようです。ただし、ポストバック間では持続せず、DataKeyのみであることに注意してください(以下を参照)。

  2. 正しく思い出せば、DataKeyNamesを指定する必要があり、<=>プロパティから取得できます。

他のヒント

次のように、独自のインデックスを保持する代わりに、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