0

Form1の1つのDataGridViewからForm3の別のDataGridViewに値を転送できるようにしたい。これを行うために、後でForm3でアクセスできるように、クラスに含まれる3つの異なる変数でそれらをフィルター処理することを選択しました。

これらはクラスです:(私はすでに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++;   
    }
}

さて、私が理解していないのは、VisualStudioが値がnullであると言う理由です。例外は次の行で発生します。

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

(これは17389です)そもそも、これ以上先に進まないでしょう。nullが返される理由がわかりません。ちなみに、DataGridViewは完全にデータで満たされています。

なぜnullを返すのですか?

4

3 に答える 3

4

verify1クラスでパブリックプロパティが定義されていますが、それらを初期化することはありません。それらはnullです。

アレイを使用する前に、アレイを初期化する必要があります。

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

また、クラスを適切に使用する方法をもう一度確認することもできます。それぞれが単一の静的プロパティを持つ3つの別々のクラスは必要ないと思います。VerifyInfo3つのフィールドを持つ単一のクラスが必要なようです。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参照型defalt値はです。null

この場合、自動プロパティを使用せずに、通常のプロパティを使用することをお勧めします。

例:

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

List<T>はこの場合、明示的にaを使用しました。これは、宣言の瞬間に配列の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ではありませんか?どのように作成しますか?

編集:

ブルーノのコメントに返信するために回答を編集しました。アレイを使用できるようにするには、最初にアレイを初期化する必要があります。簡単なテストを行うには、別のプロジェクトを作成し、これらの2行を貼り付け、プロジェクトをデバッグモードで実行し、array2の作成後にブレークポイントを設定してください。

Int32 [] array1; Int32 [] array2 = new Int32 [3];

最初の配列には何が表示されますか?初期化されていないため、nullです。array2で行ったように、配列を初期化するだけです。

これがお役に立てば幸いです、Piotr

*フォーマットして申し訳ありませんが、stackoverflowjavascriptがどういうわけかブロックされています。

于 2012-04-16T14:40:31.833 に答える