我目前正在使用布尔逻辑和真值表。我已经能够创建一个将生成2变量(a,b)
表的类。我的主要兴趣是在表格中选择某些输入并为其输出设置“真实”值。我已经能够通过override bool GetTruthValue()
对上述内容进行硬编码,并在名为true
的多行文本框中显示这些OutputTextBox
值输出结果。我希望计算真值的逻辑由用户提供。我目前的方法逻辑是由代码提供的。如何让用户选择哪个输入的输出值为“true”?通过复选框或单独的texbox(使用1或0)指示?还是其他建议?
namespace table_outputs
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public abstract class TwoItemTruthRow
{
protected TwoItemTruthRow(bool a, bool b)
{
A = a; B = b;
}
public bool A { get; protected set; }
public bool B { get; protected set; }
public abstract bool GetTruthValue();
}
public class MyCustomTwoItemTruthRow : TwoItemTruthRow
{
public MyCustomTwoItemTruthRow(bool a, bool b)
: base(a, b)
{
}
public override bool GetTruthValue()
{
// My custom logic- Hard coded
return (A && B) || (A && !B) || (!A && !B);
}
}
private static string GetHorizontalLineText()
{
return "-----------------------------------------------\r\n";
}
private static string GetFormattedTwoItemText(MyCustomTwoItemTruthRow item)
{
return string.Format("{0}\t{1}\r\n", item.A, item.B);
}
private static IEnumerable<MyCustomTwoItemTruthRow> GenerateTruthTableTwo()
{
for (var a = 0; a < 2; a++)
for (var b = 0; b < 2; b++)
yield return new MyCustomTwoItemTruthRow(
Convert.ToBoolean(a),
Convert.ToBoolean(b));
}
private void GenerateTableButton_Click(object sender, EventArgs e)
{
InputTextBox.Clear();
InputTextBox.Text += "A\tB\r\n";
InputTextBox.Text += GetHorizontalLineText();
var myTruthTable = GenerateTruthTable().ToList();
foreach (var item in myTruthTable)
{
InputTextBox.Text += GetFormattedTwoItemText(item);
InputTextBox.Text += GetHorizontalLineText();
}
}
private void ShowTrueValuesButton_Click(object sender, EventArgs e)
{
OutputTextBox.Clear();
OutputTextBox.Text += "True Values\r\n";
OutputTextBox.Text += "A\tB\r\n";
OutputTextBox.Text += GetHorizontalLineText();
var myTruthTable = GenerateTruthTableTwo().ToList();
foreach (var item in myTruthTable)
{
if (item.GetTruthValue())
OutputTextBox.Text += GetFormattedTwoItemText(item);
}
}
}
}
当前的WinForm
答案 0 :(得分:2)
您可以将对象列表绑定到表单上的DataGridView
,并为每个输入和输出字段创建列。对列使用DataGridViewCheckBoxColumn
会为您提供一组用户可以与之交互的复选框。在输入列上设置ReadOnly,并可能更改背景颜色以指示它们是固定的。
您既可以动态定义列,也可以根据需要创建任意数量的列,并隐藏您未使用的列。取决于您希望如何定义所附加数据的数据。
这是我在VS2010中做的一个模型:
这绑定到以下对象类型的列表:
public class TruthTableEntry
{
public bool A { get; set; }
public bool B { get; set; }
public bool C { get; set; }
public bool D { get; set; }
public bool Out { get; set; }
}
这是我的模型的表单代码:
public partial class Form1 : Form
{
List<TruthTableEntry> table;
public Form1()
{
// generate a 3-input truth table (8 input variations)
table = GenerateTruthTable(3);
// setup DataGridView
dataGridView1.DataSource = table;
dataGridView1.Columns[0].DataPropertyName = "A";
dataGridView1.Columns[1].DataPropertyName = "B";
dataGridView1.Columns[2].DataPropertyName = "C";
dataGridView1.Columns[3].DataPropertyName = "D";
dataGridView1.Columns[4].DataPropertyName = "Out";
// hide column 3 ('D') as unused
dataGridView1.Columns[3].Visible = false;
}
}
// Create a truth table for 1-4 inputs
static List<TruthTableEntry> GenerateTruthTable(int numInputs)
{
// range-check number of inputs
if (numInputs < 1 || numInputs > 4)
return null;
// calculate number of input states
int permutations = 1 << numInputs;
// create result list of input states
List<TruthTableEntry> res = new List<TruthTableEntry>();
for (int i = 0; i < permutations; ++i)
{
// use bit manipulation to initialize a TruthTableEntry:
TruthTableEntry ent = new TruthTableEntry
{
A = (i & (1 >> (NumInputs - 1))) != 0,
B = (i & (1 >> (NumInputs - 2))) != 0,
C = (i & (1 >> (NumInputs - 3))) != 0,
D = (i & (1 >> (NumInputs - 4))) != 0,
Out = false,
};
res.Add(ent);
}
return res;
}
dataGridView1
是一个DataGridView
,其中定义了5个DataGridViewCheckBoxColumn
列,前4列设置为ReadOnly并着色。
答案 1 :(得分:0)
我建议使用带有单独文本框的动态DataGridView来指示变量的数量。
默认值可以是2个变量,在启动时,DataGridView将作为真值表生成,并带有额外的最后一列,用于编辑每行的所需输出。
如果用户更改了变量数,请相应地调整DataGridView。 (您可能需要添加一个按钮来更改DataGridView)
无论如何,我建议瞄准界面要求尽可能少的点击/击键。