私は手動で名前のアルファベット順にソートされたオブジェクトの配列にASP.NET ListViewをバインドしています。項目を編集した後、DataSourceが再び設定され、DataBindが呼び出されます。名前が変更された場合、編集したアイテムが別のページに移動している可能性があります。
例えば; Hot DogをSausageに改名したので、SausageはItemUpdatingの完了後に移動しました。
--- OLD LIST --- --- NEW LIST ---
Hamburger Hamburger
Hot Dog______ Pizza
Pizza |_____Sausage
フォームから期待されるこの動作ですか?行を編集すると、その行を保存した後にその行が表示されるはずですか?それはまったく同じ位置にあるべきですか?保存したばかりのレコードをのみ表示する必要がありますか?
保存した後に前のオーダーを維持し、潜在的に変更するという技術的側面については、
私はなぜこれが起こっているのかを知っています。私はそれを避けるためのアイデアを探しています。
私は、ItemTemplateにEditItemTemplateのコントロールを組み合わせることと、ListView EditIndexに基づいて読み取り専用/編集可能なコントロールに可視性を設定することについて考えています。
これは実行可能なようですが、私はあなたが良い人は他のアイデアを持っている場合は私は思っています。
ユーザーが GridView
でデータセットを操作したとき、私は常に各データ項目の位置が同じであることを確認するためにデータをデータベースIDで注文します。データソースがどのように見えるかわからなければ、再ソートを回避したり変更したりすることができないかどうかは言うまでもありません。
しかし、元のデータソースをセッションに保存した場合( これは純粋な推測です(私はあなたがどのような種類のデータを扱っているかわからないので あなたがデータベースに戻り、送信後にデータを取得していると仮定して)、それに何らかの並べ替えられた識別子があれば、次のようなことができます:
void ItemUpdating(object sender, ListViewUpdateEventArgs e)
{
List foodDataSource = Session["dataSource"];
ListItem editedFoodItem = foodListView.Items[e.ItemIndex];
MyFood newFood = new MyFood(
((HiddenField)editedFoodItem.FindControl("foodId")).Value,
((Label)editedFoodItem.FindControl("foodName")).Text
);
foodDataSource.Where(k => k.foodId == newFood.foodId).foodName = newFood.foodName;
//I'm guessing that you'll save somewhere in here,
//rather than do an update-once-style commit to the database when the user clicks a save button.
foodListView.DataSource = foodDataSource;
foodListView.DataBind();
}
これは特定の WebControls
/ HtmlControls
を含めるように ItemTemplate
をハードコードしていることを前提としています。それはぎこちなく、このコードは別の関数内で FindControl
呼び出しのような不快なコードを隔離するためにリファクタリングする必要がありますが、ユーザーが GridView
し、その変更をデータベースに保存します。
Alternatively, you could keep your current save methods the same, and just add something like:
void ItemUpdating(object sender, ListViewUpdateEventArgs e)
{
ListItem editedFoodItem = foodListView.Items[e.ItemIndex];
Label foodNameLabel = ((Label)editedFoodItem.FindControl("foodName"));
foodNameLabel.BackColor = System.Drawing.Color.LightGreen;
//Saving in here, somewhere.
//I'm not totally positive that DisplayIndex is the correct property here.
foodListView.Items.Where(k => k.DisplayIndex != e.ItemIndex).BackColor = System.Drawing.Color.White;
}
あなたのユーザーがUIの手がかりを理解するかどうか、またはそれが消えてしまった場合に役立つかどうかはわかりませんが(もちろん、あなたの人生はもっと複雑になります)、これは上記のオプションよりも控えめではないと思いますすべての編集後にデータベースへの変更を保存している間は、
いくつかのケースでは、リストを頼りにしてアイテムを残しておく必要があることがわかりました。プログラマーは何が起こったのか理解していますが、平均的なユーザーはアイテムが削除されたと思うかもしれません。
この動作を示すサンプルWebサイトをまとめました。実際には非常に簡単に達成できますし、あなたのプロジェクトに自分のメソッドを適応させることができると確信しています。
ナットシェルでは、グリッドがバインドされるたびに、ユーザーの選択(またはデフォルトのソート)によってデータのリストを並べ替えますが、グリッドにバインドする直前に、その順序を保持するかどうかをチェックします私は、グリッドのDataKeyArrayから最後のシーケンス番号を抽出し、それらのシーケンス番号をそれぞれの項目に関連付けます。彼らが注文を保存したくない場合は、ソートされたリストの各項目に増分シーケンス番号を単に関連付けるだけです。次に、シーケンス番号でソートするだけです。
プロジェクトを見てくださいもっと理にかなっています。