はっきり言って、Excelで使えるような複雑な計算式は片手間で難しいと思います。紹介のあったようなライブラリを使うのも一手でしょうが、理解するのも大変。
変数が数個なら、変数は、A, B, C, X, Y, Z だけとか、仕様を絞って実装するのもありです。計算も四則演算+αしかサポートしませんとか、、。
あと、入力をどうするかですね。複雑な式だと構文解析が必要。計算の優先順位も考慮する必要もあります。
1using System;2using System.Collections.Generic;3using System.ComponentModel;4using System.Runtime.CompilerServices;5using System.Windows.Forms;67namespace WindowsFormsApp1
8{9 public partial class Form1 : Form
10{11 public Form1()12{13InitializeComponent();14 var people = new BindingList<Person>15{16 new Person()17{18 Name ="Alice",19 Age =20,20 Sex = Sex.Femail
21},22 new Person()23{24 Name ="Bob",25 Age =30,26 Sex = Sex.Male
27},28 new Person()29{30 Name ="Charley",31 Age =40,32 Sex = Sex.Other
33}34};35foreach(var person in people)36{37 person.SalarySystem = SalarySystems[0];38 SalarySystemChanged +=(sender, e)=>39{40 person.SalarySystem = e.System;41};42}43 var dataGridView = new DataGridView()44{45 Parent = this,46 Dock = DockStyle.Fill,47 DataSource = people
48};49 var panel = new Panel()50{51 Parent = this,52 Dock = DockStyle.Top,53 Height =2554};55 var comboBox = new ComboBox()56{57 Parent = panel,58 Top =2,59 Left =2,60 Anchor = AnchorStyles.Left,61 DataSource = SalarySystems,62};63 comboBox.DataBindings.Add(new Binding(nameof(ComboBox.SelectedItem), this,nameof(SalarySystem), false, DataSourceUpdateMode.OnPropertyChanged));64}6566 private SalarySystem salarySystem;67 public SalarySystem SalarySystem
68{69 get => salarySystem;70 set
71{72if(salarySystem == value)return;73 salarySystem = value;74 SalarySystemChanged?.Invoke(this, new SalarySystemEventArgs(value));75}76}7778 public event SalarySystemChangedEventHandler SalarySystemChanged;7980 public IList<SalarySystem> SalarySystems { get;}= new BindingList<SalarySystem>()81{82 new SalarySystem("年功序列", p => p.Age *10000),83 new SalarySystem("女性上位", p => p.Sex == Sex.Femail ?500000:50000),84 new SalarySystem("一律", _ =>100000)85};86}8788 public class SalarySystem
89{90 public SalarySystem(string name, Func<Person,int> calculator)91{92 Name = name;93 Calculator = calculator;94}95 public string Name { get; private set;}96 public Func<Person,int> Calculator { get; private set;}97 public override string ToString()98{99return Name;100}101}102103 public class SalarySystemEventArgs : EventArgs
104{105 public SalarySystemEventArgs(SalarySystem system)106{107 System = system;108}109 public SalarySystem System { get; set;}110}111112 public delegate voidSalarySystemChangedEventHandler(object sender, SalarySystemEventArgs e);113114 public enumSex115{116 Unknown,117 Male,118 Femail,119 Other
120}121122 public class Person : INotifyPropertyChanged
123{124 public event PropertyChangedEventHandler PropertyChanged;125126 protected voidOnPropertyChanged([CallerMemberName]string propertyName = null)127{128 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));129}130131 protected bool SetProperty<T>(ref T field, T value,[CallerMemberName]string propertyName = null)132{133if(EqualityComparer<T>.Default.Equals(field, value))return false;134 field = value;135OnPropertyChanged(propertyName);136OnPropertyChanged(nameof(Salary));137return true;138}139140 private string name;141 public string Name
142{143 get => name;144 set =>SetProperty(ref name, value);145}146147 private int age;148 public int Age
149{150 get => age;151 set =>SetProperty(ref age, value);152}153154 private Sex sex;155 public Sex Sex
156{157 get => sex;158 set =>SetProperty(ref sex, value);159}160161 private SalarySystem salarySystem;162[Browsable(false)]163 public SalarySystem SalarySystem
164{165 get => salarySystem;166 set =>SetProperty(ref salarySystem, value);167}168169 public int Salary
170{171 get => SalarySystem.Calculator(this);172}173}174}175