从其他表单调用时,DataGridView.DataSource返回空DataTable

时间:2015-05-04 22:51:00

标签: c# datagridview datatable

我有DataGridView名为dGV。

首先,我使用空DataSource设置其DataTable,其中包含300行和50列,以便用户可以在DataGridView中输入数据。

当我在输入数据后尝试从其他表单调用dGV时,它总是返回空DataTable。这是我的代码:

MainForm:

public MainForm()
{
   InitializeComponent();
   dGV.DataSource = GetTable();
}

public DataTable GetTable()
{
    DataTable table = new DataTable();
    for(int i = 1; i < 51; i++)
    {
        table.Columns.Add("V"+i);
    }
    for (int i = 1; i < 301; i++)
    {
        table.Rows.Add();
    }     
    return table;
}

public DataTable GetData()
{
    DataTable dt = dGV.DataSource as DataTable;
    return dt;
}

Form2:

private void NDokButton_Click(object sender, EventArgs e)
{
    MainForm mf = new MainForm();
    DataTable dt = mf.GetData();
    var n = dt.Rows[0].ItemArray[0];
    String a = n.ToString();
    MessageBox.Show(a);
}

它显示一个空的MessageBox。

3 个答案:

答案 0 :(得分:2)

单击按钮时,您正在创建MainForm的新实例。这将填充DataGridView一堆空数据。然后你抓住一个空单元格并在文本框中显示它。

将对现有MainForm的引用传递给第二种形式。

private void NDokButton_Click(object sender, EventArgs e)
{
    //You're creating a new main form here.  You need an instance of the existing form.
    MainForm mf = new MainForm();
    DataTable dt = mf.GetData();
    var n = dt.Rows[0].ItemArray[0];
    String a = n.ToString();
    MessageBox.Show(a);
}

答案 1 :(得分:1)

这是因为你的第二个表单创建了一个全新的表单,其中一个表单从不填充数据网格。

您需要将引用传递给第一个for或其数据网格,以实现您想要的目标,而不是创建新格式。

请记住,新意味着新的。仅仅因为你创建了一个对象的新实例并不意味着它与第一个对象有任何关系(静态除了这里的一个坏主意)。

在第二个表单中创建一个For类型的公共属性,并在创建第二个表单时设置该值,我假设它是在第一个表单中发生的。你基本上会做这样的事情:

secondForm.RefToFirst = this;

答案 2 :(得分:1)

我在Form2

中添加了新功能
 public DataTable dat = new DataTable();
 public DataTable GetFromMainForm(DataTable dt) {
            this.dat = dt;
            return dat;
        }

        private DataTable GetFromMainForm() {
            return dat;
        }


private void NDokButton_Click(object sender, EventArgs e)
        {
            DataTable dt = GetFromMainForm();
            var n = dt.Rows[0].ItemArray[0];
            String a = n.ToString();
            MessageBox.Show(a);

        }

MainForm我将DataTable传递给Form2

Form2 f = new Form2();
f.GetFromMainForm(dt);