0

私のプロジェクトでは、データ アクセス用の 2 つのフォームと別のクラス (DataConn) があります。Form1 のボタンが Form2 を開き、この (子) フォームが DataConn クラスの GetData メソッドを呼び出して、Form2 のテキスト ボックスに名前を入力します。Form2 には、DataConn クラスの NavigateRecords メソッドを呼び出す次のレコードを取得するためのボタンがあります。NavigateRecord メソッドは、読み込み時に Form2 のテキスト ボックスにデータを入力するために GetData 内から呼び出されますが、Form2 の Next イベントから次のレコードを取得するためにも呼び出されます。NavigateRecords が Form2 の [次へ] ボタン イベントから呼び出されると、次の行に「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが表示されます: myDR = myDS.Tables["People"].Rows[increment]; NavigateRecords で。同じ行が Form2 ロード イベントで実行されると、なぜこれが起こらないのですか? DataRow のインスタンスを作成すると、警告 'System.Data.

DataConn クラス:

public class DataConn
{
    private DataSet myDS;
    private DataRow myDR;
    private int maxRows = 0;
    private int increment = 0;
    private string name;

    public int MaxRows
    { get { return maxRows; } }

    public int Increment
    { get { return increment; } set { increment = value; } }

    public string Name
    { get { return name; } }

    public void GetData()
    {
        // class variable
        string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Temp\Testing\TestDatabase.accdb";

        //everything created in 'using' gets destroyed/goes out of scope at end of 'using' block.
        using (OleDbConnection myConn = new OleDbConnection(connectionString))
        {
            string SQL = "SELECT * From Test";
            OleDbDataAdapter myDA = new OleDbDataAdapter(SQL, myConn);
            myDS = new DataSet();
            try
            {
                myConn.Open();
                myDA.Fill(myDS, "People");
                NavigateRecords();  //called to populate textbox in NewForm
                maxRows = myDS.Tables["People"].Rows.Count;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                myConn.Close();
            }
        }
    }

    public void NavigateRecords()
    {
        try
        {
            myDR = myDS.Tables["People"].Rows[increment];//exception             
            name = myDR.ItemArray.GetValue(1).ToString();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        {
        } 

    }
}

Form2 の Load および Next_CLick イベント:

private void frmNewForm_Load(object sender, EventArgs e)
    {
        DataConn theConn = new DataConn();
        theConn.GetData();
        txtName.Text = theConn.Name;
    }

private void btnNext_Click(object sender, EventArgs e)
    {
        DataConn theConn = new DataConn();
        if (theConn.Increment != theConn.MaxRows - 1)
        {
            theConn.Increment++;
            theConn.NavigateRecords();
            FillTextBox();
        }

編集: 新しいプロジェクトを作成し、フォーム クラス自体にすべてを含めました。Datarow は最初は null で、NavigateRecords メソッドで呼び出されると System.Data.DataRow に設定され、フォームが開いている限りそのままになります。元のプロジェクトでは、データ行が Form2 の次のイベントから再度呼び出されると、null に戻り、例外がスローされます。そもそもnullだったのに、なぜnullであることが問題なのですか?

4

1 に答える 1

0

これを試して:

DataConn theConn;
private void frmNewForm_Load(object sender, EventArgs e)
{
    theConn = new DataConn();
    theConn.GetData();
    txtName.Text = theConn.Name;
}

private void btnNext_Click(object sender, EventArgs e)
{
    if (theConn.Increment != theConn.MaxRows - 1)
    {
        theConn.Increment++;
        theConn.NavigateRecords();
        FillTextBox();
    }
}
于 2013-06-20T17:35:45.180 に答える