ユーザーがデータグリッドビューで独自の式を記述できるようにする必要があります。エクセルの関数のようなもの。
数式定義の例:
したがって、ユーザーは独自の数式を数式セルに記述し、他の表にそれぞれの結果を表示します。どうすればこれを行うことができますか?
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();
最近、私が取り組んでいるプロジェクトで同様の要件 (式の動的解析) があり、WF (Windows Workflow Foundation) の VB 式を使用することになりました。それは確かに、この機能があなたにとってどれほど重要であるか、そしてあなたがそれにどれだけの努力を払っても構わないと思っているかによって異なります. 私の場合、いくつかの理由で NCalc よりも優れていることがわかりました。
とにかく、これは私がこのテーマについて書いた短いブログ投稿です。
それを行う方法はいくつかありますが、それらはすべて式を実行可能なコードに変換することを中心に展開しています。独自のパーサーを作成しますか、それとも既存のパーサーを使用しますか? C# 自体、IronPython、IronRuby、既製のコンポーネントの一部。完全なパーサーを使用している場合は、ユーザーがそれを使用してできることを、不注意またはその他の方法で制限する方法を検討する必要があるかもしれません...
それらが見た目と同じくらい単純である場合、ある種の式ビルダー (2 つの名前付きの値と演算子を選択する) が有効な方法かもしれませんが、式の作成と評価の両方をモジュール化して、後で強化できるようにします。 .
ただし、それらがいかに単純に見えるかを考えると、式を事前に定義して (ある種のバッキング ストアからメタ データとしてロードし、ユーザーが入力するのではなく、これらのいずれかを選択するようにします。これには簡単に数か月を費やすことができます)。デザインの側面、それは価値がありますか?