ListView DataItemはNullを表示します
質問
数日前、問題について書きました 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をデータバインドするコードは、前の質問で示したものです。 。
質問:
-
<%#Eval("Value") %>
のListViewDataItem
を繰り返し処理するときに、各項目がListview
であるのはなぜですか? - 辞書から
null
を取得するにはどうすればよいですか? - 他に不足しているものはありますか?
- 表示されるアイテムに基づいてプログラムで
Foo.Id
取得したい場合、何を使用しますか?現在のように、現在のListViewは、選択されたId
に基づいて表示されます。選択されたそれらのFoo
が表示され、ユーザーはBar
のDataKeyNames
を変更し、保存を押すと、それらの変更が反映されます。
更新
判明したように、私の問題は 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が見られていたかを判断します。
このアプローチに対する批判、およびそれを改善する方法は大歓迎です。
解決
いくつかの簡単な回答:
-
それを機能させるには、データバインディングを使用する必要があります。つまり、
DataSource
に割り当ててDataBind()
を呼び出します。編集:あなたはそれをしているようです。ただし、ポストバック間では持続せず、DataKey
のみであることに注意してください(以下を参照)。 -
正しく思い出せば、
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
}
所属していません StackOverflow