0

我希望能够将值从 Form1 中的一个 DataGridView 传输到 Form3 中的另一个 DataGridView。为此,我选择在 3 个不同的变量中过滤它们,这些变量将在类中,以便稍后在 Form3 中访问它们。

这些是类:(我已经将它们作为一个具有 3 个变量的类)

public class verify1
{
    public static int[] CodUser { get; set; }
}

public class verify2
{
    public static DateTime[] DataFim{ get; set; }
}

public class verify3
{
    public static string[] Nome { get; set; }
}

尽管如此,当我为变量赋值时,我在第一次运行 for 时得到了 NullReferenceException。

这是我用来赋值的代码:

int a = 0;
for (int i = 0; i < dataGridView1.RowCount - 1; i++)
{    
    DateTime date = Convert.ToDateTime(dataGridView1.Rows[i].Cells[2].Value);   
    if (date <= DateTime.Now)   
    {   
        verify1.CodUser[a] = Convert.ToInt32(dataGridView1.Rows[i].Cells[0].FormattedValue);    
        verify2.DataFim[a] = Convert.ToDateTime(dataGridView1.Rows[i].Cells[2].FormattedValue);
        verify3.Nome[a] = Convert.ToString(dataGridView1.Rows[i].Cells[3].Value);   
        a++;   
    }
}

现在,我不明白为什么 Visual Studio 说该值为空。异常发生在以下行:

verify1.CodUser[a] =   Convert.ToInt32(dataGridView1.Rows[i].Cells[0].FormattedValue);

(即17389)首先,不会让我走得更远。我不明白为什么它返回null。顺便说一句,DataGridView 完全由数据实现。

为什么它返回null?

4

3 回答 3

4

您在verify1类中定义了公共属性,但您从不初始化它们。它们是空的。

您需要在使用它们之前初始化数组:

int a = 0;
int rowCount = dataGridView1.RowCount;
verify1.CodUser = new int[rowCount];
verify2.DataFim = new DateTime[rowCount];
verify3.Nome = new string[rowCount];

您可能还想再看看如何正确使用类。我猜你不需要三个单独的类,每个类都有一个静态属性。看起来你应该有一个VerifyInfo包含三个字段的类。然后,您可以将它们存储在List<T>

public class VerifyInfo
{
    public int CodUser { get; set; }
    public DateTime DataFim { get; set; }
    public string Nome { get; set; }
}

然后你的循环代码会更干净:

var verifyInfos = new List<VerifyInfo>();

for(int i = 0; i < dataGridView1.RowCount - 1; i++)
{
    var date = Convert.ToDateTime(
        dataGridView1.Rows[i].Cells[2].Value);

    if(date <= DateTime.Now)
    {
        verifyInfos.Add(new VerifyInfo
        {
            CodUser = Convert.ToInt32(dataGridView1.Rows[i].Cells[2].Value),
            DataFim = Convert.ToDateTime(
                dataGridView1.Rows[i].Cells[2].FormattedValue),
            Nome = Convert.ToString(dataGridView1.Rows[i].Cells[3].Value)
        });
    }
}
于 2012-04-16T14:38:59.627 回答
1

自动属性会自动初始化为返回类型的默认值。您正在处理引用类型 Array。引用类型的默认值为null

在这种情况下,最好避免使用自动属性,而是使用普通属性。

例子:

public class verify1
{
    static List<int> codUser = new List<int>(); //definition
    public static List<int> CodUser
    { 
       get { return codUser;} 
       set {codUser = value;} 
     }
}

在这种情况下,我特别使用了 a List<T>,因为在声明时您不知道数组的 excat 大小,而且根据提供的代码,它可能会有所不同。

编辑

可以像这样使用它(在实践中就像你以前一样)

for (int i = 0; i < dataGridView1.RowCount - 1; i++)
{    
    DateTime date = Convert.ToDateTime(dataGridView1.Rows[i].Cells[2].Value);   
    if (date <= DateTime.Now)   
    {   
        verify1.CodUser[a].Add( Convert.ToInt32(dataGridView1.Rows[i].Cells[0].FormattedValue));    
        ......
        ....  
    }
}

希望这可以帮助。

于 2012-04-16T14:38:56.430 回答
1

verify1.CodUser 不是 null 吗?你如何创造它?

编辑:

我已经编辑了我的答案以回复布鲁诺的评论。您必须先初始化数组才能使用它们。为了做一个简单的测试,请创建一个单独的项目,粘贴这两行,在调试模式下运行你的项目,并在创建 array2 后设置断点:

Int32[] 数组1;Int32[] array2 = new Int32[3];

你在第一个数组中看到了什么?它是空的,因为它没有被初始化。您所要做的就是像我对array2 所做的那样初始化您的数组。

希望这会有所帮助,Piotr

*抱歉格式化,stackoverflow javascript 以某种方式被我阻止了。

于 2012-04-16T14:40:31.833 回答