如果在mainForm中运行,如何在另一个表单中添加行

时间:2014-02-02 13:09:13

标签: c# winforms datagridview

我已经尝试过这段代码在Form2的DataGridView中添加我在主窗体(Form1)上创建的一行函数,但是当我运行它的函数时没有结果添加行,有谁知道错误在哪里? 感谢

[编辑] MainForm1中的代码:

public partial class Form1 : Form
{
    Form2 sub = new Form2();
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        sub.AddRow(new string[] { "1", "2" }); // able to loop
        sub.Show();
        this.Enabled = false;
    }
}

[edit] Form2中的代码:

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }
    public void AddRow(string[] values)
    {
        this.DGVFile.Rows.Add(values);
    }
}

我得到一些答案的提示。当数据加载到Form2中的datagridview中时,我的问题得到了解答,并且我希望在打开Form2时可以禁用mainform(Form1)。现在它已经解决了。谢谢大家。

4 个答案:

答案 0 :(得分:1)

请改用sub.Show();。这样,下面的代码sub.ShowDialog();甚至不会被调用。

ShowDialog打开一个新窗体作为模态窗口,这意味着焦点仅在新窗口中,并且在关闭新窗口时会调用此调用下面的行。

您可以在MSDN herehere上找到有关这两种方法的更多信息。

<强>更新

  

但是如果打开form2

我想要禁用mainform

我可以想到两个选择。

第一个,在我看来更好的是,推迟开放表格

Form2 sub = new Form2();
sub.RegisterParent(this);
for (int x = 1; x <= 5; x++ )
{
    string[] row;
    row = new string[] { "1","2"};
    sub.DGVFile.Rows.Add(row);
}
sub.ShowDialog(); // open when everything is prepared

第二个是

sub.Show();
this.Enabled = false;

但这不是一个很好的解决方案,因为你必须在关闭它之前从其他表单启用它,并且有很多方法可以关闭表单,你必须考虑所有。

答案 1 :(得分:1)

从按钮点击事件中创建第二个表单:Form2 sub = new Form2();。这样,第二种形式只创建一次。然后使用ShowDialogHide方法显示模式第二种形式(第一种形式将处于非活动状态)。在第二个表单中创建一个额外的公共方法,以将新行添加到现有的DataGridView。

可能的解决方案如下所示:

public partial class MainForm : Form
{
    private DataForm dataForm = null;

    public MainForm()
    {
        InitializeComponent();
        // init data form
        dataForm = new DataForm();
        dataForm.Init();
    }

    private void buttonAddRow_Click(object sender, EventArgs e)
    {
        // add values
        dataForm.AddRow(new string[] { "10", "20" });
        // show a modal second form, so that the first can not be selected while the second is open!
        dataForm.ShowDialog(this);
    }
}

public partial class DataForm : Form
{
    public DataForm()
    {
        InitializeComponent();
    }
    // init the grid
    internal void Init()
    {
        this.dataGridView.Columns.Add("A", "A");
        this.dataGridView.Columns.Add("B", "B");
        for (int x = 1; x <= 5; x++)
        {
            string[] row;
            row = new string[] { "1", x.ToString() };
            this.dataGridView.Rows.Add(row);

        }
    }
    // add values to the grid
    public void AddRow(string[] values)
    {
        this.dataGridView.Rows.Add(values);
    }
    // hide second form
    private void buttonClose_Click(object sender, EventArgs e)
    {
        Hide();
    }
}

两次添加后的输出是:

enter image description here

答案 2 :(得分:0)

仅在表单子关闭后执行sub.ShowDialog();之后的代码。尝试使用sub.Show()

答案 3 :(得分:0)

请查看以下代码:

namespace TEST_CSA
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 sub = new Form2();
            sub.Show(this);
            this.Enabled = false;
            sub.RegisterParent(this);
            for (int x = 1; x <= 5; x++)
            {
                string[] row;
                row = new string[] { "1", "2" };
                sub.DGVFile.Rows.Add(row);
            }
        }

    }
}

命令Show(this)使Form1成为Form2的父窗体,并确保Form2始终显示在Form1的顶部。若要取消激活Form1,请使用this.Enabled = false;要在Form2关闭时重新激活Form1,请使用以下代码:

namespace TEST_CSA
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }


        private Form1 _parent;
        internal void RegisterParent(Form1 form)
        {
            this._parent = form;
        }

        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            _parent.Enabled = true;
        }

    }
}