SampleForm.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. using FormulaEnginePoC.FormulaEngine;
  2. using FormulaEnginePoC.FormulaEngine.CspImpl;
  3. using FormulaEnginePoC.FormulaEngine.DepImpl;
  4. using FormulaEnginePoC.SampleClasses;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Windows.Forms;
  9. using FormulaEnginePoC.FormulaEngine.Mapping;
  10. namespace FormulaEnginePoC.UI
  11. {
  12. public partial class SampleForm : Form
  13. {
  14. private readonly TypeMapping _bookTypeMapping = new TypeMapping(typeof(Book));
  15. private List<Book> _dataSource;
  16. private CspCalcFormula<Book, object> _cspCalcFormula;
  17. private CspFilterFormula<Book> _cspFilterFormula;
  18. private DepCalcFormula<Book, object> _depCalcFormula;
  19. private DepFilterFormula<Book> _depFilterFormula;
  20. public SampleForm()
  21. {
  22. InitializeComponent();
  23. FieldGrid.AutoGenerateColumns = true;
  24. FieldGrid.DataSource = _bookTypeMapping.Properties;
  25. RefreshDataSource();
  26. foreach (var item in FormulaConverter.GetOperators())
  27. OperatorToolStripDropDownButton.DropDownItems.Add(new ToolStripMenuItem { Text = item });
  28. foreach (var item in FormulaConverter.GetFunctions())
  29. FunctionToolStripDropDownButton.DropDownItems.Add(new ToolStripMenuItem { Text = item });
  30. }
  31. private void RefreshDataSource()
  32. {
  33. _dataSource = new List<Book>
  34. {
  35. new Book {Name = "C#高级编程", Cat = "软件开发", IsUp = true, Price = 34.5m,PublishTime = DateTime.Now.AddYears(-1).Date}
  36. , new Book {Name = "摩托维修与禅", Cat = "哲学小说", IsUp = true, Price = 78.9m,PublishTime = DateTime.Now.Date}
  37. , new Book {Name = "VB高级编程", Cat = "软件开发", IsUp = true, Price = 23.4m,PublishTime = DateTime.Now.AddYears(1).Date}
  38. , new Book {Name = "C#入门经典", Cat = "软件开发", IsUp = true, Price = 12.3m,PublishTime = DateTime.Now.AddYears(-2).Date}
  39. , new Book {Name = "高效休息法", Cat = "养生保健", IsUp = true, Price = 56.7m,PublishTime = DateTime.Now.AddYears(-3).Date}
  40. };
  41. DataSourceGrid.AutoGenerateColumns = true;
  42. DataSourceGrid.DataSource = _dataSource;
  43. }
  44. private void CompileX<T>(out T field, CodeExecPanel eventSource, Func<string, T> newFormula) where T : Formula
  45. {
  46. field = null;
  47. eventSource.Code = "";
  48. try
  49. {
  50. field = newFormula(FormulaTextBox.Text);
  51. eventSource.Code = field.CodeExpression;
  52. field.Compile();
  53. }
  54. catch (Exception exception)
  55. {
  56. eventSource.Code += Environment.NewLine + Environment.NewLine + exception;
  57. }
  58. }
  59. private void ExecuteFilterX(CodeExecPanel eventSource, FilterFormula<Book> formula)
  60. {
  61. try
  62. {
  63. var result = _dataSource.Where(formula.CompiledFunc).ToArray();
  64. eventSource.Result = $"共 {result.Length} 项{Environment.NewLine}"
  65. + string.Join(Environment.NewLine, result.Select(p => $" - {p.Name}"));
  66. }
  67. catch (Exception exception)
  68. {
  69. eventSource.Result = exception.ToString();
  70. }
  71. }
  72. private void ExecuteCalcX(CodeExecPanel eventSource, CalcFormula<Book, object> formula)
  73. {
  74. try
  75. {
  76. var result = formula.CompiledFunc((Book)DataSourceGrid.SelectedRows[0].DataBoundItem);
  77. eventSource.Result = result?.ToString() ?? "<null>";
  78. }
  79. catch (Exception exception)
  80. {
  81. eventSource.Result = exception.ToString();
  82. }
  83. }
  84. private void NewToolStripButton_Click(object sender, EventArgs e)
  85. {
  86. RefreshDataSource();
  87. }
  88. private void NewFormulaToolStripButton_Click(object sender, EventArgs e)
  89. {
  90. FormulaTextBox.Clear();
  91. }
  92. private void FieldGrid_DoubleClick(object sender, EventArgs e)
  93. {
  94. if (1 != FieldGrid.SelectedRows.Count)
  95. {
  96. return;
  97. }
  98. FormulaTextBox.SelectedText = ((PropertyMapping)FieldGrid.SelectedRows[0].DataBoundItem).Display + " ";
  99. FormulaTextBox.Focus();
  100. }
  101. private void Insert_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
  102. {
  103. var selected = FormulaTextBox.SelectedText;
  104. if (sender == FunctionToolStripDropDownButton)
  105. {
  106. FormulaTextBox.SelectedText = e.ClickedItem.Text + $" ( {selected} ) ";
  107. FormulaTextBox.SelectionStart -= 3;
  108. }
  109. else
  110. {
  111. FormulaTextBox.SelectedText = e.ClickedItem.Text + " ";
  112. }
  113. FormulaTextBox.Focus();
  114. }
  115. private void DepCalcExecPanel_CompileButtonClicked(object sender, EventArgs e)
  116. {
  117. CompileX(out _depCalcFormula, (CodeExecPanel)sender, formula => new DepCalcFormula<Book, object>(formula));
  118. }
  119. private void DepCalcExecPanel_ExecuteButtonClicked(object sender, EventArgs e)
  120. {
  121. ExecuteCalcX((CodeExecPanel)sender, _depCalcFormula);
  122. }
  123. private void DepFilterExecPanel_CompileButtonClicked(object sender, EventArgs e)
  124. {
  125. CompileX(out _depFilterFormula, (CodeExecPanel)sender, formula => new DepFilterFormula<Book>(formula));
  126. }
  127. private void DepFilterExecPanel_ExecuteButtonClicked(object sender, EventArgs e)
  128. {
  129. ExecuteFilterX((CodeExecPanel)sender, _depFilterFormula);
  130. }
  131. private void CspCalcExecPanel_CompileButtonClicked(object sender, EventArgs e)
  132. {
  133. CompileX(out _cspCalcFormula, (CodeExecPanel)sender, formula => new CspCalcFormula<Book, object>(formula));
  134. }
  135. private void CspCalcExecPanel_ExecuteButtonClicked(object sender, EventArgs e)
  136. {
  137. ExecuteCalcX((CodeExecPanel)sender, _cspCalcFormula);
  138. }
  139. private void CspFilterExecPanel_CompileButtonClicked(object sender, EventArgs e)
  140. {
  141. CompileX(out _cspFilterFormula, (CodeExecPanel)sender, formula => new CspFilterFormula<Book>(formula));
  142. }
  143. private void CspFilterExecPanel_ExecuteButtonClicked(object sender, EventArgs e)
  144. {
  145. ExecuteFilterX((CodeExecPanel)sender, _cspFilterFormula);
  146. }
  147. }
  148. }