C# 为类整数[]赋值时出现NullReference异常
我希望能够将值从Form1中的一个DataGridView传输到Form3中的另一个DataGridView。为了做到这一点,我选择在类中的3个不同变量中对它们进行过滤,以便稍后在Form3中访问它们 这些是类:(我已经将它们作为一个单独的类,包含3个变量) 另外,当我为变量赋值时,我在第一次运行时就得到了一个NullReferenceException 这是我用来赋值的代码: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 -
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)
});
}
}