2009-06-30 13 views
3

私はC#コードのいくつかの書式設定を行う少しのアドインを書いた。アドインで Execメソッド私は次の操作を行いテキストフォーマットのための私のvs2008アドインは非常に遅い

try { 
    TextSelection selection = (EnvDTE.TextSelection)_applicationObject.ActiveDocument.Selection; 
    String foo = String.Empty;      
    if (!text.IsEmpty) {        
    foo = someCoolObjectThatFormatsText.Format(selection.Text); 
    selection.Text = foo; // here everything gets painfully slow :-(
    } 
} 
catch (Exception) { 
    throw; 
} 

コードとライン「SelectedText.Text = foobarに。」 VSは選択の各行をステップごとに再構築します。あなたはこのステップを実行することで簡単に見ることができます。しかし、私は、なぜそれが遅い取得しないでください。

ヒント TIA

+1

のErより道速いですが、私はあなたの「foobarに」を推測していますあらかじめ定義されている 'foobar'がないので、 'foo'にする必要があります。 –

+0

あなたはもちろん正しいです。それを固定した。 – helpless

+0

try/catchを取り除きます。あなたがしていることはすべて「投げ」なので、何もしません。 –

答えて

2

JFTR: 私はTextSelection.Insert(...)を使用する必要がありましたが、インデントのビジュアルスタジオの深さも取得するには、選択したテキストを完全に最初と最後ライン:

TextSelection text = (EnvDTE.TextSelection)_applicationObject.ActiveDocument.Selection; 
text.SmartFormat(); // sets the correct indention als studio 
/* the following lines will expand the selection to whole lines: */ 
int lineSpan = text.BottomPoint.Line - text.TopPoint.Line; 
text.MoveToPoint(text.TopPoint,false);      
text.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstColumn,false);      
text.LineDown(true,lineSpan);      
text.EndOfLine(true); 
/* and now my custom textformatting */ 
text.Insert(someCoolObjectThatFormatsText.Format(text.Text),(int)vsInsertFlags.vsInsertFlagsContainNewText);                      
text.Collapse(); 

私は本当にこの天気を知りませんがtextselectionsを変更するための良い方法ですが、それは正常に動作し、元のアドインコード

+0

うん、ちょうど 'selection.Text = myText;ではなく' selection.Insert(myText);を使って、行く方法です、それは*ばかげた速さです*。 –

0

私はアドインを使っていませんでしたが、あなたは「ヒント」を求めていたので、ここは私です。

割り当てを行う前に画面の更新を無効にしてみてください。

また、ヘルプファイルが言う、

「Textプロパティが設定されている場合は、テキストを文書に貼り付けられたときに、テキストの値は、選択したテキストの前に挿入し、その後崩壊し、何が起こるかに似ていますこのプロパティは、エディタが挿入モード(非上書き型)モードのときと同じように動作することに注意してください.128文字目以降のテキストは切り捨てられます。

これは、変数が期待どおりに上書きされずに代わりに追加され、前のテキストが削除されることを意味するようです。最初に変数を空にして、何か変更があるかどうか確認してください。

また、割り当ての代わりにPasteMethodを使用してテキストを置換することも検討してください。

+0

いいえ、変数を空にすると動作しませんでした。 – helpless