using FormulaEnginePoC.FormulaEngine; using FormulaEnginePoC.FormulaEngine.CspImpl; using FormulaEnginePoC.FormulaEngine.DepImpl; using FormulaEnginePoC.SampleClasses; using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using FormulaEnginePoC.FormulaEngine.Mapping; namespace FormulaEnginePoC.UI { public partial class SampleForm : Form { private readonly TypeMapping _bookTypeMapping = new TypeMapping(typeof(Book)); private List _dataSource; private CspCalcFormula _cspCalcFormula; private CspFilterFormula _cspFilterFormula; private DepCalcFormula _depCalcFormula; private DepFilterFormula _depFilterFormula; public SampleForm() { InitializeComponent(); FieldGrid.AutoGenerateColumns = true; FieldGrid.DataSource = _bookTypeMapping.Properties; RefreshDataSource(); foreach (var item in FormulaConverter.GetOperators()) OperatorToolStripDropDownButton.DropDownItems.Add(new ToolStripMenuItem { Text = item }); foreach (var item in FormulaConverter.GetFunctions()) FunctionToolStripDropDownButton.DropDownItems.Add(new ToolStripMenuItem { Text = item }); } private void RefreshDataSource() { _dataSource = new List { new Book {Name = "C#高级编程", Cat = "软件开发", IsUp = true, Price = 34.5m,PublishTime = DateTime.Now.AddYears(-1).Date} , new Book {Name = "摩托维修与禅", Cat = "哲学小说", IsUp = true, Price = 78.9m,PublishTime = DateTime.Now.Date} , new Book {Name = "VB高级编程", Cat = "软件开发", IsUp = true, Price = 23.4m,PublishTime = DateTime.Now.AddYears(1).Date} , new Book {Name = "C#入门经典", Cat = "软件开发", IsUp = true, Price = 12.3m,PublishTime = DateTime.Now.AddYears(-2).Date} , new Book {Name = "高效休息法", Cat = "养生保健", IsUp = true, Price = 56.7m,PublishTime = DateTime.Now.AddYears(-3).Date} }; DataSourceGrid.AutoGenerateColumns = true; DataSourceGrid.DataSource = _dataSource; } private void CompileX(out T field, CodeExecPanel eventSource, Func newFormula) where T : Formula { field = null; eventSource.Code = ""; try { field = newFormula(FormulaTextBox.Text); eventSource.Code = field.CodeExpression; field.Compile(); } catch (Exception exception) { eventSource.Code += Environment.NewLine + Environment.NewLine + exception; } } private void ExecuteFilterX(CodeExecPanel eventSource, FilterFormula formula) { try { var result = _dataSource.Where(formula.CompiledFunc).ToArray(); eventSource.Result = $"共 {result.Length} 项{Environment.NewLine}" + string.Join(Environment.NewLine, result.Select(p => $" - {p.Name}")); } catch (Exception exception) { eventSource.Result = exception.ToString(); } } private void ExecuteCalcX(CodeExecPanel eventSource, CalcFormula formula) { try { var result = formula.CompiledFunc((Book)DataSourceGrid.SelectedRows[0].DataBoundItem); eventSource.Result = result?.ToString() ?? ""; } catch (Exception exception) { eventSource.Result = exception.ToString(); } } private void NewToolStripButton_Click(object sender, EventArgs e) { RefreshDataSource(); } private void NewFormulaToolStripButton_Click(object sender, EventArgs e) { FormulaTextBox.Clear(); } private void FieldGrid_DoubleClick(object sender, EventArgs e) { if (1 != FieldGrid.SelectedRows.Count) { return; } FormulaTextBox.SelectedText = ((PropertyMapping)FieldGrid.SelectedRows[0].DataBoundItem).Display + " "; FormulaTextBox.Focus(); } private void Insert_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) { var selected = FormulaTextBox.SelectedText; if (sender == FunctionToolStripDropDownButton) { FormulaTextBox.SelectedText = e.ClickedItem.Text + $" ( {selected} ) "; FormulaTextBox.SelectionStart -= 3; } else { FormulaTextBox.SelectedText = e.ClickedItem.Text + " "; } FormulaTextBox.Focus(); } private void DepCalcExecPanel_CompileButtonClicked(object sender, EventArgs e) { CompileX(out _depCalcFormula, (CodeExecPanel)sender, formula => new DepCalcFormula(formula)); } private void DepCalcExecPanel_ExecuteButtonClicked(object sender, EventArgs e) { ExecuteCalcX((CodeExecPanel)sender, _depCalcFormula); } private void DepFilterExecPanel_CompileButtonClicked(object sender, EventArgs e) { CompileX(out _depFilterFormula, (CodeExecPanel)sender, formula => new DepFilterFormula(formula)); } private void DepFilterExecPanel_ExecuteButtonClicked(object sender, EventArgs e) { ExecuteFilterX((CodeExecPanel)sender, _depFilterFormula); } private void CspCalcExecPanel_CompileButtonClicked(object sender, EventArgs e) { CompileX(out _cspCalcFormula, (CodeExecPanel)sender, formula => new CspCalcFormula(formula)); } private void CspCalcExecPanel_ExecuteButtonClicked(object sender, EventArgs e) { ExecuteCalcX((CodeExecPanel)sender, _cspCalcFormula); } private void CspFilterExecPanel_CompileButtonClicked(object sender, EventArgs e) { CompileX(out _cspFilterFormula, (CodeExecPanel)sender, formula => new CspFilterFormula(formula)); } private void CspFilterExecPanel_ExecuteButtonClicked(object sender, EventArgs e) { ExecuteFilterX((CodeExecPanel)sender, _cspFilterFormula); } } }