从C#表单中以编程方式生成的元素获取实时输入

时间:2014-07-13 17:10:44

标签: c# visual-studio input real-time

如何使用通过代码生成的表单细节实时获取复选框(以及文本更改时的文本框)的值?

以下代码在按下按钮时生成表单,表单包含复选框和richtextbox。理想情况下,我希望任何交互都有效果,所以如果我粘贴一个1和0的网格,复选框会更新,一旦复选框被点击,textarea中相应的一个或零将更新(这样我就可以复制了网格(矩阵)输出并进入另一个程序。

我知道如何使用visual studio GUI制作工具获取事件,但不是从这样的程序化创建表单中获取事件。

    private void begin_button_Click(object sender, EventArgs e)
    {
        // Build the child form
        Form check_box = new Form();
        check_box.FormBorderStyle = FormBorderStyle.FixedSingle;

        // Get the values from the textboxes
        int height = Convert.ToInt16(this.height_input.Text);
        int width = Convert.ToInt16(this.width_input.Text);

        // Set the dimensions of the form
        check_box.Width = width * 15 + 40;
        check_box.Height = ( height * 15 + 40 ) * 3;

        // Build checkboxes for the checkbox form
        CheckBox[] chk;
        chk = new CheckBox[height * width];

        int count = 0;
        for (int i = 1; i <= height; i++)
        {
            for (int j = 1; j <= width; j++)
            {
                chk[count] = new CheckBox();
                chk[count].Name = count.ToString();
                chk[count].Width = 15; // because the default is 100px for text
                chk[count].Height = 15;
                chk[count].Location = new Point(j * 15, i * 15);
                chk[count].CheckedChanged += new EventHandler(this.CheckedChanged);
                check_box.Controls.Add(chk[count]);
                count += 1;
                //Console.WriteLine(" i: " + i + " j: " + j + " Count: " + count);
            }
        }

        RichTextBox output_area;
        output_area = new RichTextBox();
        output_area.Location = new Point(chk[0].Location.X, chk[count-1].Location.Y + 30);
        check_box.Controls.Add(output_area);
        output_area.Text = "hello world\n1,1,1,1,1,1,1,1,1\n0,0,0,0,0,1,0,1\nthese ones and zeros are meant to update in real time!";
        output_area.Width = check_box.Width - 40;
        output_area.Height = check_box.Height / 2;

        // Run the form
        check_box.ShowDialog();
    }

编辑:

我添加了事件处理程序并且它正常工作,但是我无法访问复选框表单,只能访问主表单。

    private void CheckedChanged(object sender, EventArgs e)
    {
        //throw new NotImplementedException();
        CheckBox x = (CheckBox)sender;
        Console.WriteLine(x);
        Console.WriteLine(x.Name.ToString());
    }

2 个答案:

答案 0 :(得分:2)

查看表单设计器为您生成的.Designer文件!

无论如何,在你的循环中,尝试这样的事情:

chk[count].CheckedChanged += MyFancyHandler;

处理程序本身看起来就像一个普通的处理程序:

private void MyFancyHandler( object sender, EventArgs e )
{
    // ...
}

另请注意,sender参数将包含对事件所引用的复选框/控件的引用。

答案 1 :(得分:1)

当复选框检查状态发生变化时,下面的代码会更新富文本框中的矩阵文本。

    RichTextBox output_area;
    CheckBox[] chk;
    Size MatrixSize;
    private void begin_button_Click()
    {
        // Build the child form
        Form check_box = new Form();
        check_box.FormBorderStyle = FormBorderStyle.FixedSingle;
        check_box.StartPosition = FormStartPosition.CenterScreen;

        // Get the values from the textboxes
        int height = Convert.ToInt16("10");
        int width = Convert.ToInt16("7");

        MatrixSize = new Size(width, height);

        // Set the dimensions of the form
        check_box.Width = width * 15 + 40;
        check_box.Height = (height * 15 + 40) * 3;

        // Build checkboxes for the checkbox form

        chk = new CheckBox[height * width];

        int count = 0;
        for (int i = 1; i <= height; i++)
        {
            for (int j = 1; j <= width; j++)
            {
                chk[count] = new CheckBox();
                chk[count].Name = count.ToString();
                chk[count].Width = 15; // because the default is 100px for text
                chk[count].Height = 15;
                chk[count].Location = new Point(j * 15, i * 15);
                check_box.Controls.Add(chk[count]);
                chk[count].CheckedChanged += new EventHandler(CheckBox1_CheckedChanged);


                count += 1;
                //Console.WriteLine(" i: " + i + " j: " + j + " Count: " + count);
            }
        }


        output_area = new RichTextBox();
        output_area.Location = new Point(chk[0].Location.X, chk[count - 1].Location.Y + 30);
        check_box.Controls.Add(output_area);
        output_area.Text = "hello world\n1,1,1,1,1,1,1,1,1\n0,0,0,0,0,1,0,1\nthese ones and zeros are meant to update in real time!";
        output_area.Width = check_box.Width - 40;
        output_area.Height = check_box.Height / 2;

        // Run the form
        check_box.ShowDialog();
    }


    private void CheckBox1_CheckedChanged(Object sender, EventArgs e)
    {
        CheckBox c = (CheckBox)sender;
        Debug.WriteLine(c.Name);

        StringBuilder sb = new StringBuilder();

        int count = 0;
        for (int i = 1; i <= MatrixSize.Height; i++)
        {
            for (int j = 1; j <= MatrixSize.Width; j++)
            {
                if (chk[count].Checked)
                {
                    sb.Append("1,");
                }
                else
                {
                    sb.Append("0,");
                }
                count += 1;
            }
            sb.Append("\r\n");
        }

        output_area.Text = sb.ToString(); 

    }