2012-04-10 5 views
1

DevExpress XtraGridコントロールを持つメインフォームを持つプログラムがあります。それは私のDBからのデータで多くの行を持っています。私は、選択した行を編集するために、編集フォームとメインフォーム上の編集ボタンを持っています。選択したオブジェクトの情報を編集フォームにプルできるようになりましたが、何らかの理由でUPDATEコマンドを実行するときに問題が再発しました。私はgridView1.GetFocusedRow()と私のshowAttributesメソッドのために完全に働いたが、もはや動作しないように私のメインフォーム上の選択された行を参照しています。フォームの切り替え時にヌル参照

マイコードが続きます。 'call'がnullであるため、例外を戻しています。いくつかのことを書き留めておきます。最初の行を編集するだけの場合は、main.gridView1.Focus()main.gridView1.FocusRowHandle(0)を試してみました。問題は解決されていません。これは、行がまだ正確に焦点を当てているが、参照が何とか失われたと私に伝えているようだ。 Edit.csでMain.cs

private void btnEdit_Click(object sender, EventArgs e) 
    { 
     //This is the key, that lets you access an attribute of the selected row. 
     Object obj = gridView1.GetFocusedRow(); 

     //1) Show NewEdit Form 
     Edit edit = new Edit(); 
     edit.Show(); 

     //2) Display properties of this object from DB 
     edit.showAttributes(obj); 
    } 

ここ

private void btnSubmit_Click(object sender, EventArgs e) 
    { 
     Main main = new Main(); 
     Object obj = main.gridView1.GetFocusedRow(); 
     try 
     { 
      performUpdate(obj); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Error: " + ex); 
     } 
    } 

    public void performUpdate(Object call1) 
    { 
     Main main = new Main(); 
     CallLog call = new CallLog(); 
     call = call1 as CallLog; 

     executeSQLUpdate(call.Oid); 
     main.xpServerCollectionSource1.Reload(); 
    } 

はshowAttributesコードがある - 同じことを行いますが

public void showAttributes(Object call1) 
    { 
     try 
     { 
      Main main = new Main(); 
      CallLog call = new CallLog(); 
      call = call1 as CallLog; 

      txtCompany.Text = call.CompanyName; 
      txtFirst.Text = call.FirstName; 
      txtMiddle.Text = call.MiddleName; 
      txtLast.Text = call.LastName; 
      txtPhone.Text = call.PhoneNumber; 
      txtFax.Text = call.Fax; 
      txtEmail.Text = call.Email; 
      txtAttention.Text = call.Attention; 
      txtCareOf.Text = call.CareOf; 
      txtAddress1.Text = call.Address1; 
      txtAddress2.Text = call.Address2; 
      txtCity.Text = call.City; 
      txtState.Text = call.State; 
      txtZip.Text = call.ZipCode; 
      txtProvince.Text = call.Province; 
      txtCountry.Text = call.Country; 
      txtMessage.Text = call.Message; 
      txtResponse.Text = call.Response; 

      if (call.VIP == 1) { chkVIP.Checked = true; } else { chkVIP.Checked = false; } 
      if (call.ThreatCall == 1) { chkThreat.Checked = true; } else { chkThreat.Checked = false; } 
      if (call.FollowUp == 1) { chkFollowUp.Checked = true; } else { chkFollowUp.Checked = false; } 
      if (call.EscalationRequired == 1) { chkEscalation.Checked = true; } else { chkEscalation.Checked = false; } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Error: " + ex); 
      return; 
     } 
    } 
の作品

また... 私はこれをいくつかの方法で、パラメーターなしで、別の場所などで試してみました。問題はmain.gridView1.GetFocusedRow()がnullを返すことです。また、メインフォームから一連のメソッドとして実行すると、どちらも機能しません(gridView1.GetFocusedRow()もnullです)。 Edit.csで

+0

[.NETのNullReferenceExceptionは何ですか?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net) –

答えて

1

あなたは

Main main = new Main(); 
    Object obj = main.gridView1.GetFocusedRow(); 

これは、それを表示せずに新しいメインを作成し、明らかにemtpyのGridViewからOBJを取得しようとします。 示されているすべてのコードで同じエラーが繰り返されます。
また、CallLogインスタンスの作成と使用が非常に混乱しています。

+0

これは問題のようです。私は何も含まれていない最初の行に新しいフォームを作成しています。しかし、私はメインをコンストラクタに渡すことはできません...あなたは解決策で記事を参照できますか?私はグーグルで "C#のメインフォームを保持"、多くの結果ではありませんでした... CallLogは属性を持つクラスです。 GetFocusedRow()メソッドはオブジェクトを返すので、私は 'as CallLog;'を使用し、CallLogオブジェクトにキャストする必要があります。 – Paul

+1

これがアプリケーションのメインフォームであり、アプリケーションのライフタイム内でメインフォームのインスタンスを1つだけインスタンス化できることがわかっている場合は、プログラムクラスに静的なpublicプロパティを追加することをお勧めします。 Application.Runメソッドを使用して表示するメインフォームインスタンスです。この方法で、この静的プロパティを使用していつでもメインフォームインスタンスにアクセスできます。 – Uranus

+0

'Application.SetCompatibleTextRenderingDefault(false);が実行される前にProgram.csのpublic static Mainインスタンスを作成できません。例外を返します。 App.runの後、しかしApp.runの前にそれを置くと、それを公開して無用にすることはできません。 – Paul

関連する問題