C# 为类整数[]赋值时出现NullReference异常

C# 为类整数[]赋值时出现NullReference异常,c#,winforms,exception-handling,datagridview,nullreferenceexception,C#,Winforms,Exception Handling,Datagridview,Nullreferenceexception,我希望能够将值从Form1中的一个DataGridView传输到Form3中的另一个DataGridView。为了做到这一点,我选择在类中的3个不同变量中对它们进行过滤,以便稍后在Form3中访问它们 这些是类:(我已经将它们作为一个单独的类,包含3个变量) 另外,当我为变量赋值时,我在第一次运行时就得到了一个NullReferenceException 这是我用来赋值的代码: int a = 0; for (int i = 0; i < dataGridView1.RowCount -

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

这些是类:(我已经将它们作为一个单独的类,包含3个变量)

另外,当我为变量赋值时,我在第一次运行时就得到了一个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++;   
    }
}
(17389)一开始,我不会让我走得更远。我不明白它为什么返回空值。顺便说一下,DataGridView完全由数据实现


为什么返回null?

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

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

例如:

public class verify1
{
    static List<int> codUser = new List<int>(); //definition
    public static List<int> CodUser
    { 
       get { return codUser;} 
       set {codUser = value;} 
     }
}
公共类验证1
{
静态列表codUser=new List();//定义
公共静态列表用户
{ 
获取{return codUser;}
设置{codUser=value;}
}
}
在本例中,我特意使用了
列表
,因为在声明时您不知道数组的excat大小,而且根据提供的代码,它可能会有所不同

编辑

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

for(int i=0;i如果(日期自动属性自动初始化为返回类型的默认值。
您正在处理引用类型
数组
。引用类型的默认值
null

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

例如:

public class verify1
{
    static List<int> codUser = new List<int>(); //definition
    public static List<int> CodUser
    { 
       get { return codUser;} 
       set {codUser = value;} 
     }
}
公共类验证1
{
静态列表codUser=new List();//定义
公共静态列表用户
{ 
获取{return codUser;}
设置{codUser=value;}
}
}
在本例中,我特意使用了
列表
,因为在声明时您不知道数组的excat大小,而且根据提供的代码,它可能会有所不同

编辑

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

for(int i=0;i如果(date您在
verify1
类中定义了公共属性,但您从未初始化它们。它们为空

在使用阵列之前,您需要初始化阵列:

int a = 0;
int rowCount = dataGridView1.RowCount;
verify1.CodUser = new int[rowCount];
verify2.DataFim = new DateTime[rowCount];
verify3.Nome = new string[rowCount];
您可能还想再看看如何正确使用类。我猜您不需要三个单独的类,每个类都有一个静态属性。看起来您应该有一个带有三个字段的
VerifyInfo
类。然后您可以将它们存储在
列表中:

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

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)
        });
    }
}
var verifyInfos=new List();
对于(int i=0;i如果(date您在
verify1
类中定义了公共属性,但您从未初始化它们。它们为空

在使用阵列之前,您需要初始化阵列:

int a = 0;
int rowCount = dataGridView1.RowCount;
verify1.CodUser = new int[rowCount];
verify2.DataFim = new DateTime[rowCount];
verify3.Nome = new string[rowCount];
您可能还想再看看如何正确使用类。我猜您不需要三个单独的类,每个类都有一个静态属性。看起来您应该有一个带有三个字段的
VerifyInfo
类。然后您可以将它们存储在
列表中:

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

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)
        });
    }
}
var verifyInfos=new List();
对于(int i=0;i如果(date不是verify1.CodUser null?如何创建它

编辑:

我已编辑了我的答案以回复Bruno的评论。您必须首先初始化阵列才能使用它们。要进行简单测试,请创建一个单独的项目,粘贴这两行,在调试模式下运行项目,并在创建array2后设置断点:

Int32[]阵列1; Int32[]阵列2=新的Int32[3]

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

希望这有帮助, 皮奥特


*很抱歉格式化,stackoverflow javascript不知何故被我阻止了。

verify1.CodUser不是空的吗?如何创建它

编辑:

我已编辑了我的答案以回复Bruno的评论。您必须首先初始化阵列才能使用它们。要进行简单测试,请创建一个单独的项目,粘贴这两行,在调试模式下运行项目,并在创建array2后设置断点:

Int32[]阵列1; Int32[]阵列2=新的Int32[3]

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

希望这有帮助, 皮奥特


*很抱歉格式化,stackoverflow javascript不知怎么被我阻止了。

空值表示从未初始化过的Verify1.CodUser(和公司)。空值表示Verify1.CodUser(和公司)从未初始化过,但我分配给的是verify1.CodUser,对吗?我希望CodUser保存一个值。或者我必须执行类似verify1.CodUser=0;?@BrunoCharters-否。您已将CodUser定义为数组。您需要在添加值之前初始化数组。非常感谢,例外情况如下
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)
        });
    }
}