2012-02-24 10 views
0

ユーザーのログインの詳細をデータベースに書き込もうとしています。 送信ボタンをクリックすると、ImはNullReferenceExceptionを取得します。 ユーザー名、電子メール、パスワード、ConfirmPasswordの4つのテキストボックス があります。ASP.NET NullReferenceException

protected void Button1_Click(object sender, EventArgs e) 
     { 
      if ((RegisterUserWizardStep.FindControl("Password") as TextBox).Text == (RegisterUserWizardStep.FindControl("ConfirmPassword") as TextBox).Text) 
      { 
       //call the method to execute insert to the database 
       ExecuteInsert((RegisterUserWizardStep.FindControl("UserName") as TextBox).Text, 
           (RegisterUserWizardStep.FindControl("Email") as TextBox).Text, 
          (RegisterUserWizardStep.FindControl("Password") as TextBox).Text); 
       Response.Write("Record was successfully added!"); 
       ClearControls(Page); 
      } 
      else 
      { 
       Response.Write("Password did not match"); 
       (RegisterUserWizardStep.FindControl("Password") as TextBox).Focus(); 
      } 
     } 

ありがとうございます。あなたが言及し

+1

例外はどの行で発生しますか? –

+0

そして、あなたが使用している値がnullであるという例外を打つと?これらの質問に答えて、あなたはあなたの問題をかなり解決しました。 ;-) – Chris

+0

また、チェックするだけです。あなたの説明では、あなたは 'Username' TextBoxを持っていると言いました。コードは 'RegisterUserWizardStep.FindControl(" UserName ")'を探しています。これは質問のタイプミスですか? –

答えて

0

にFindControlは、テキストボックス等のパネルのようなnested under another child controlている可能性があるため、あなたが後にあるコントロールを見つけることができませんでした。その可能性

代わりの

if ((RegisterUserWizardStep.FindControl("Password") as TextBox).Text 

TextBox passwordTextBox = RegisterUserWizardStep.FindControl("Password") as TextBox; 
// .. same for username and email 
if ((passwordTextBox != null) && (usernameTextBox != null) ...) 
{ 
// Do something with the textboxes 
} 
// else you have a bug 

を試してみてくださいこれは、同じコントロール(DRYの原理)でFindControlコードを繰り返さないようにします。

+0

ありがとうございます。出来た..:) – android

1

は、4つのコントロールがあります - ユーザー名、電子メール、パスワードやConfirmPassword

にFindControl(X)はチェックのより良い方法がにある

nullを返しているので、あなたが見ているヌル例外はほぼ確実ですような何か:さらに

TextBox myTextBox = RegisterUserWizardStep.FindControl(X) as TextBox; 

if(myTextBox != null){ 
    //Continue 
} 
else{ 
    //Write out some error information - now you know what the problem is. 
} 

を、これはあなたの即時のエラーに関連していないが、その後、あなたが直接あなたのExecuteInsertメソッドにテキストボックスのそれぞれの内容を養う - あなたは、いくつかをやったほうが良いと思います検証、あまりにも、期待値を確認するだけです。何の制御UserNameという名前かUserNameという名前のコントロールがTextBoxにキャストできない場合が存在しない場合RegisterUserWizardStep.FindControl("UserName") as TextBoxよう

0

コードは、どちらかnullを返します。 nullのような参照のプロパティTextを取得しようとしたため、これは例外の原因になりそうです。

static class ControlExtensions { 

    public T Find(this Control parent, String name) where T : Control { 
    var control = parent.FindControl(name); 
    if (control == null) 
     throw new ArgumentException(String.Format("Cannot find control named '{0}'.", name); 
    var t = control as T; 
    if (t == null) 
     throw new ArgumentException(String.Format("Control named '{0}' does not have type '{1}.", name, typeof(T).Name); 
    return t; 
    } 

} 

あなたはその後、UserNameコントロールのTextプロパティを取得することができます:

RegisterUserWizardStep.Find<TextBox>("UserName").Text 

この呼び出しは、より多くをスローしますより良い問題は、あなたが拡張機能を定義することができているかを理解するには

コントロールが見つからない場合は説明的な例外です。

0

あなたの説明には、Username TextBoxがあります。

コードはRegisterUserWizardStep.FindControl("UserName")を探しています。

これは誤字ですか?それ以外の場合は、例外の原因となる可能性があります。