1

アプリケーションでリスト/グリッド コントロールを作成し、それをWeb アプリケーションFlexで使用しています。.NET非常に長い話を短くするために、シリアル化されたオブジェクトの Web サービスから XML を取得しています。1 ページに表示できるページ数に制限があります。データ グリッドをページ化し、ページ間で並べ替え、いくつかの基本的なフィルター処理を行いました。

ページングに関しては、ページをキーとする辞書を使用し、そのページの XML を保存しています。このようにして、このディクショナリに保存したページにユーザーが戻ってくるたびに、Web サービスにアクセスする代わりに、ローカル メモリから XML を取得できます。基本的に、データのページの Web サービスへの各呼び出しから取得したデータをキャッシュしています。

キャッシュが期限切れになる可能性のあるものがいくつかあります。フィルタリングとソートが主な理由です。ただし、ユーザーはエディタを開いてグリッド内のデータ行を編集できます。編集したデータが原因で、行に表示されるデータが古くなる可能性があります。簡単に Web サービスにアクセスしてページ全体のデータを取得できますが、ページ サイズは実行時に設定されるため、取得するレコードが大量に表示される可能性があります。

それでは、私が経験している問題の核心に触れさせてください。データのページ全体が返されないようにするために、完全に更新されたレコードを要求する Web サービスを呼び出します (エディターがデータの保存を処理します)。

カスタム オブジェクトを使用しているため、サーバー上でそれらを XML にシリアル化する必要があります (これは、ソフトウェアの他の部分で既に処理されています)。すべてのデータは、e4x で XML を介して処理されます。Dictionary のキャッシュは、XMLList として格納されます。

それでは、私のコードをお見せしましょう...

var idOfReplacee:String = this._WebService.GetSingleModelXml.lastResult.*[0].*[0].@Id;
var xmlToReplace:XMLList = this._DataPages[this._Options.PageIndex].Data.(@Id == idOfReplacee);

if(xmlToReplace.length() > 0)
{
    delete (this._DataPages[this._Options.PageIndex].Data.(@Id == idOfReplacee)[0]);
    this._DataPages[this._Options.PageIndex].Data += this._WebService.GetSingleModelXml.lastResult.*[0].*[0];
}

基本的に、置き換えたいノードのIDを取得します。次に、キャッシュの Data プロパティ ( XMLList) でそれを見つけます。2 行目のフィルターが を返すので、存在することを確認しますXMLList

私が抱えている問題は、削除行にあります。その行をリストからそのノードを削除することはできません。削除行の次の行が機能します。ノードをリストに追加しました。

そのノードを置換または削除するにはどうすればよいですか (キャッシュの .Data プロパティのフィルター ステートメントから見つけたノードを意味します)。

これが投稿されたときに、すべての変数のアンダースコアがエスケープされたままにならないことを願っています! そうでなければthis.&#95 == this._

4

4 に答える 4

2

答えてくれてありがとう。

@テオ:いくつかの異なる方法で置き換えを試みました。何らかの理由でエラーになることはありませんが、リストが更新されることはありません。

@マット:解決策を見つけました。この問題は、あなたが提案したことからではなく、削除がリストでどのように機能するか (少なくとも、この例ではどのように私が持っているか) に起因していました。

_DataPages ディクショナリ オブジェクトの Data プロパティは、定義ノードのリストです (別の XML ドキュメントの以前のフィルタリングによって到達されました)。

<Models>
     <Definition Id='1' />
     <Definition Id='2' />
</Models>

私はこの小さな取引をすることになりました:

//gets the index of the node to replace from the same filter
var childIndex:int = (this._DataPages[this._Options.PageIndex].Data.(@Id == idOfReplacee)[0]).childIndex();
//deletes the node from the list
delete this._DataPages[this._Options.PageIndex].Data[childIndex];
//appends the new node from the webservice to the list
this._DataPages[this._Options.PageIndex].Data += this._WebService.GetSingleModelXml.lastResult.*[0].*[0];

したがって、基本的には、Data プロパティである XMLList 内のノードのインデックスを取得する必要がありました。そこから、delete キーワードを使用してリストから削除できます。+= は、新しいノードをリストに追加します。

私は、「SelectSingleNode」を呼び出してから「replaceChild」を使用してこの種のことを行う ActiveX または Mozilla XmlDocument を使用することに慣れています。まあ、少なくともこれは、他の誰かが見つけられるフォーラムにあります。自分の質問に答えるとどうなるか、手順がわかりません。おそらく、この洞察は他の誰かがやって来て、質問にうまく答えるのに役立つでしょう!

于 2008-08-14T19:06:41.337 に答える
1

おそらくあなたはreplace代わりに使うことができますか?

var oldNode : XML = this._DataPages[this._Options.PageIndex].Data.(@Id == idOfReplacee)[0];
var newNode : XML = this._WebService.GetSingleModelXml.lastResult.*[0].*[0];    

oldNode.parent.replace(oldNode, newNode);
于 2008-08-14T13:58:33.923 に答える
1

これが信じられないほど古い質問であることは知っていますが、この問題に対する最も簡単な解決策はわかりません (私が思うに)。

Theo はここで正しい方向性を示しましたが、replace の使用方法には多くの誤りがあります (そして、E4X のほとんどすべてが関数であるという事実)。

これでうまくいくと思います:

oldNode.parent().replace(oldNode.childIndex(), newNode);

replace()最初のパラメーターでさまざまなタイプを取ることができますが、知る限り、XML オブジェクトはそれらの 1 つではありません。

于 2016-05-04T13:28:44.620 に答える
0

問題はすぐにはわかりませんので、推測するしかありません。あなたが持っている行は、リストのトップレベルで、値が。に等しい属性「Id」を持つdelete最初のアイテムを探しています。一致するIDを見つけるためにXML構造を深く掘り下げる必要がないことを確認してください。idOfReplacee

代わりにこれを試してください:

delete (this._DataPages[this._Options.PageIndex].Data..(@Id == idOfReplacee)[0]);

(の後に余分な「。」があることに注意してくださいData)。投稿したコードの2行目にブレークポイントを設定し、XMLListが期待どおりに表示されるようにすることで、これをより簡単にデバッグできます。

于 2008-08-14T13:55:29.920 に答える