質問

奇妙な動作をしているListViewコントロールがあります-ポストバック後に行が部分的にしか更新されません。私はここにいる誰かがなぜこれが起こっているのかを明らかにすることを望んでいます。

My listview DataSourceは、ページセッション状態で保存されるアイテムのリストにバインドされます。これは意図的なものであり、複数のユーザーがデータを表示するため、部分的に古いビューをタイムアウトさせるためです。プレーンリゾート操作では、並べ替えはJavaScriptを介してページ上で処理され、リスト/セッションデータの順序はコールバックを介して同期されます。コールバックは、アクセス許可レベルもチェックします。より複雑な特定のリゾート操作では、ページ上のjavascriptがページへのポストバックを作成して、ソートロジックを処理します。リスト/セッションはコールバックのように更新され、リストビューコントロールはデータに再バインドされます。ページが再び読み込まれ、行に新しい順序が表示されます。問題ないでしょう?

問題は、リストビューの要素の 一部 が新しい順序に従って値を変更しないことです。ページで処理されるハイパーリンクとテキスト(<!> lt;%#Eval(<!> quot; ProjectAbbrev <!> quot;)%<!> gt;など)は適切に更新されますが、チェックボックス、リテラル、 OnItemDataBoundイベントメソッドによって値が設定されたドロップダウンはそうではありません-<!> quot; frozen <!> quot;コードをステップスルーすると、メソッドがポストバック中に実行され、コントロールが新しい値に設定される必要があることが明らかになります。リストを手動で切り捨てて元のサイズの半分にすると、それらのアイテムのみが再入力されますが、チェックボックスなどは元の値を保持します。

だから私の質問は、これらの要素がポストバックの残りのリストビューコントロール要素とともに更新されないのはなぜですかASP.NETのページライフサイクルを誤解しているか、何らかのバグに遭遇したかのどちらかです。

この時点で、より複雑なソート操作をjavascriptのページに移動する必要があると考えていますが、それはかなり注意が必要であり、できればそうしないようにしたいと思います。


更新:EnableViewStateをfalseに設定しようとしましたが、これは修正されません。ページの他の部分(保存)は最終的にビューステートの読み取りに依存しているため、どのような場合でもこの戦術を使用できませんでした。
更新:この問題を明らかにすることを期待して、いくつかのコードスニペットを提供しています:

ページ:HyperLink要素はポストバック後に適切に更新されますが、OnQueueRepeater_ItemDataBoundメソッドで値が割り当てられたCheckBoxは同じままです。

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TextProcessorProjects.ascx.cs" Inherits="ETD.UI.Controls.TextProcessorProjects" %>

<asp:ListView ID="QueueListView" runat="server" OnItemDataBound="OnQueueRepeater_ItemDataBound">
 <ItemTemplate>
  <tr>
   <td><asp:HyperLink runat="server" ID="ProjectIDLink"><%# Eval("ProjectAbbrev") %></asp:HyperLink></td>
   <td><asp:CheckBox runat="server" ID="ScannedCheckBox" BorderStyle="None" /></td>
  </tr>
 </ItemTemplate>
</asp:ListView>

コードビハインド:ポストバック時に、次のコードが実行されます。

protected List<Book> QueueDataItems
{
 get { return (List<Book>)Session["Queue"]; }
 set { Session["Queue"] = value; }
}

else if (IsPostBack && !Page.IsCallback)
{
 // resort QueueDataItems List appropriately
 ResortQueue(Request.Params) 
 // rebind
 QueueListView.DataSource = QueueDataItems;
 QueueListView.DataBind();
}

protected void OnQueueRepeater_ItemDataBound(object sender, ListViewItemEventArgs e)
{
 // ...
 // ... other controls set
 CheckBox scannedCheckBox = e.Item.FindControl("ScannedCheckBox") as CheckBox;
 scannedCheckBox.Checked = book.Scanned;
}

更新:これを機能させるのをあきらめ、javascriptを使用してソートロジックをクライアント側に移動しました。この奇妙な振る舞いがなぜ起こったのかについて誰にもアイデアがあれば、私はまだそれらを聞くことに非常に興味があります!

役に立ちましたか?

解決

興味のないところで、ページのどのポイントにデータバインディングしますか? Page_Load?

OnPreRenderで試してください-役立つかもしれません。

他のヒント

ViewStateが音を立てて、データを再入力しているように聞こえます。 いずれにせよ、すべてのポストバックでデータバインディングを行う場合は、おそらくListViewのEnableViewStateをfalseに設定してページサイズを小さくする必要があります。

これは、ページのライフサイクル中にさまざまなイベントがトリガーされる順序に関係していると思います。 ASP.NETページライフサイクルの概要を参照してください。 Page_OnPreRenderでデータバインディングを実行して、ページのコントロールイベント(データの更新を引き起こす)の後に再展開が行われるようにします。

おそらく、QueueListViewが何らかの理由で再バインドされている可能性があります。

DataBind()の後にDataSource値をリセットして、何が起こるかを確認してください

QueueListView.DataBind();
QueueListView.DataSource = null;

これがキャッシュの問題である可能性はありますか? XMLDatasourceでリストビューを使用して、同様の問題に遭遇しました。すべてのビューステートをオフにしてみました。コードビハインドでリストビューをバインドし、XPathを使用して、aspxページの画面にすべてを書き込みます。これは検索で使用されました。...次に検索を行ったとき、新しい情報は表示されませんでした。その理由は、XMLDatasourceのキャッシュがデフォルトで有効になっているためです。私の場合、毎回DBにアクセスしていたので、キャッシュする必要はありませんでした。データソースのキャッシュをオフにし、すべての問題が修正されました。

これについて言及したのは、エラーがあなたのものと同じように聞こえたからです。 itemdataboundで本をどのように取得しているかわかりません-物事の見た目でXMLデータソースを使用していません。幸運を祈ります......あなたはすでに先に進んだように聞こえますが:-)。

チェックボックスコントロールはReadOnly = trueまたはEnabled = falseですか?

これらのプロパティのいずれかが上記のように設定されているコントロールでは、コードビハインドでコントロールをどのように操作しようとしても更新されないという問題がありました。ビューステートを無効にすると、その小さな<!> quot; feature <!> quot;もバイパスされると思います。 ASP.NETですが、一見の価値があります。

また、アイテムがクライアントサイドコードを介してソートされている場合、その順序はポストバックで保持されますか?セッションで使用しているCLRオブジェクトをjavascriptを介して変更できるとは思いません。

これが役立つかどうかわからない場合は、<!> lt;%#Eval(<!> quot; ProjectAbbrev <!> quot;)%<!> gt;を置き換えます。 OnQueueRepeater_ItemDataBoundメソッドでHyperlink.Textを割り当て、すべての行が正しく読み込まれるかどうかを確認します。

これはおそらくあなたの問題を解決しませんが、結果を知ることは興味深いでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top