2012-04-08 12 views
1

DataGridviewで独自の数式を書くことができるようにする必要があります。 Excelの関数のようなもの。式定義のC#、ユーザー定義の式

例:

x http://oi40.tinypic.com/6e2004.jpg

したがって、ユーザが数式セルに自分の式を記述し、他のテーブルにそれぞれについて示した結果です。どのように私はこれを行うことができますか?

+0

これを行う方法がわからないので、まだ何もありません。 – user1320251

+0

単純な数式を解析して評価できるパーサーがいらない場合は、NCalcをご覧ください。http://ncalc.codeplex.com/ –

答えて

0

あなたの数式はC#に操作され、SystemCodeCom.Compilerを使用して動的にコンパイルされ、可変値のフライフィードで実行することができます。
そうでなければ、ミニパーサ/コンパイラのような特別なスキルを必要とし、複雑になってしまうことがあります。
動的な複雑化に関するcodeproject記事がありますherehere。しかし、Web上には他にもたくさんの例があります。

+0

Tnx!私は動的な複雑化を試みます。 – user1320251

+0

私の意見では、新しいコンパイルされたアイテムはすべてアプリケーションドメインに追加され、もうアンロードできないため、(Web上の平均的な例で行われているように)動的コンパイルはかなり悪いことです。より良いアプローチは独自のアプリケーションドメインを作成しますが、動的コンパイルされたコードと通信するときにはオーバーヘッドが大きくなります。公式の場合、私は公式パーサーを使用します。 [this one](http://www.codeproject.com/Articles/7335/An-extensible-math-expression-parser-with-plug-ins)。 –

+1

@UweKeimうーん、それはかなり素敵に見える - おそらく別の答えの価値がある! – Ricibob

0

これを実行するにはいくつかの方法がありますが、それらはすべて式を実行可能コードに変換することを中心にしています。 独自のパーサーを作成するか、既存のパーサーを使用するかどうかを確認しますか? C#自体、IronPython、IronRuby、いくつかの棚のコンポーネントから。完全なパーサーを使用している場合は、ユーザーが意図せずに行うことができるものを制限する方法を調べることをお勧めします。

見た目は単純ですが、何らかの種類の式ビルダー2つの名前付きの値と演算子)が、表現方法を構築し、評価して、後の時点で強調することができるように、モジュール化する方法です。

しかし、どのようにシンプルであるかを考えれば、ある種のバッキングストアからメタデータとしてロードされ、ユーザーが入力するのではなく、これらの中から1つを選択するようにすることができます。それは価値がある、デザインのこの局面で数ヶ月過ごす?

1

私はNCalc

NCalcは.NETの数式評価である。NCalcは、任意の式を解析し、その結果を評価することができ、静含むをしようとするだろうまたは動的パラメータおよびカスタム関数

Dictionary<string, int> dict = new Dictionary<string, int>() { { "Income", 1000 }, { "Tax", 5 } }; 

string expressionString = "Income * Tax"; 
NCalc.Expression expr = new NCalc.Expression(expressionString); 
expr.EvaluateParameter += (name, args) => 
    { 
     args.Result = dict[name]; 
    }; 

int result = (int)expr.Evaluate(); 
+0

私はすべての解決策を見て、現時点でNCalsはおそらく私の問題の最も単純な解決策です。みんな助けてくれてありがとう。 – user1320251

0

最近私が取り組んでいるプロジェクトで同様の要件(式の動的解析)があり、WF(Windows Workflow Foundation)のVB式を使用して終了しました。確かに、この機能がどれほど重要であるか、それにどれくらいの努力を払うのかによって決まります。私の場合、それはいくつかの理由でNCalcよりも優れ判明:

  • それが得られた発現の木は、それがために同じ言語だ個々の表現
  • の依存関係を決定するために分析することができますNCalc
  • よりも複雑な式をサポートWFのような表現(これは既にプロジェクトのどこかで使用しています)

とにかく、here is a short blogpost私はこのテーマに書いています。