リスト内の行を編集した後にアイテムの位置を維持する...試してもよろしいですか?

私は手動で名前のアルファベット順にソートされたオブジェクトの配列に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に基づいて読み取り専用/編集可能なコントロールに可視性を設定することについて考えています。

これは実行可能なようですが、私はあなたが良い人は他のアイデアを持っている場合は私は思っています。

2

3 答え

ここで見ている動作は、情報を適切に並べ替えた後の変更内容の典型的な出力です。あなたが古い構造を維持する必要がある場合、あなたはあなたの記事に言及したものと同様のルートに行く必要があります。

しかし、私はもう少し時間がかかり、これが実際にあなたのユーザーが望んでいるものかどうかを確認すると、多数の編集の後でこれが本当に混乱するのがわかります。

2
追加された
はい、私はこのようにすべて動作するいくつかのWebベースの管理ツールを使用しています。リストは各編集後に再ソートされます。唯一のバリエーションは、あなたがリストにいた場所に留まるか、新しい場所にレコードをフォローするかのようです。これは、ページングが有効になっている場合に特に関係します。これは、ユーザーの要件に依存します。
追加された 著者 Tevo D,
完璧な例があります。私のオンラインバンキングの予定支払いは、支払期日別にソートされています。私は最初の項目の日付を後日に変更することができ、それはリストから消えるかもしれません。このことは、一定の期間にわたって何が払い出されるかを示すものであり、期待される行動である。
追加された 著者 Tevo D,
データのリストの一般的な動作を編集した後に再ソートしていますか?私は元の場所から離れて並べ替える行を編集する必要があったWebアプリケーションを思い出すことを試みていますが、現時点では失敗しています。
追加された 著者 Orange Kid,

ユーザーが 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の手がかりを理解するかどうか、またはそれが消えてしまった場合に役立つかどうかはわかりませんが(もちろん、あなたの人生はもっと複雑になります)、これは上記のオプションよりも控えめではないと思いますすべての編集後にデータベースへの変更を保存している間は、

1
追加された

いくつかのケースでは、リストを頼りにしてアイテムを残しておく必要があることがわかりました。プログラマーは何が起こったのか理解していますが、平均的なユーザーはアイテムが削除されたと思うかもしれません。

この動作を示すサンプルWebサイトをまとめました。実際には非常に簡単に達成できますし、あなたのプロジェクトに自分のメソッドを適応させることができると確信しています。

ナットシェルでは、グリッドがバインドされるたびに、ユーザーの選択(またはデフォルトのソート)によってデータのリストを並べ替えますが、グリッドにバインドする直前に、その順序を保持するかどうかをチェックします私は、グリッドのDataKeyArrayから最後のシーケンス番号を抽出し、それらのシーケンス番号をそれぞれの項目に関連付けます。彼らが注文を保存したくない場合は、ソートされたリストの各項目に増分シーケンス番号を単に関連付けるだけです。次に、シーケンス番号でソートするだけです。

プロジェクトを見てくださいもっと理にかなっています。

0
追加された