0

私は現在、ブール論理と真理値表を扱っています。(a,b)2変数テーブルを生成するクラスを作成することができました。私の主な関心は、テーブル内の特定の入力を選択し、その出力に「true」値を設定することです。上記を介してハードコーディングし、それらの値の出力結果をと呼ばれる複数行のテキストボックスにoverride bool GetTruthValue()表示することができました。真理値を計算するロジックをユーザーが提供したい。私の現在のアプローチでは、ロジックはコードによって提供されています。どの入力の出力値が`trueになるかをユーザーに選択させるにはどうすればよいですか?チェックボックスまたは個別のtexbox(1または0)で示しますか?または他の提案?trueOutputTextBox

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 ここに画像の説明を入力してください

ここに画像の説明を入力してください

4

2 に答える 2

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;
}

dataGridView1DataGridView5DataGridViewCheckBoxColumn列が定義された で、最初の 4 列は ReadOnly に設定され、色が付けられています。

于 2013-02-19T01:18:39.333 に答える
0

変数の数を示すための別のテキストボックスを備えた動的 DataGridView をお勧めします。

デフォルト値は 2 つの変数にすることができ、起動時に DataGridView が真理値表として生成され、各行の目的の出力を編集するための最後の列が追加されます。

ユーザーが変数の数を変更した場合は、それに応じて DataGridView を調整します。(DataGridView を変更するボタンを追加することもできます)

いずれにせよ、できるだけ少ないクリック/キーストロークを必要とするインターフェイスを目指すことをお勧めします.

于 2013-02-19T00:47:46.690 に答える