2010-12-14 2 views
0

だから、みんな、私はC#のドロップダウンリストにデータをバインドしようとしています。 DDLにデータを入力しようとすると、Nullエラーが発生します。私はこのコードをフロントエンドに使用しています。リピータのドロップダウンリストへのSQLデータバインディングC#

<asp:Repeater ID="RepeaterHardDrives" runat="server"> 
        <HeaderTemplate> 
         <table border="0" cellpadding="0" cellspacing="0" width="100%"> 
        </HeaderTemplate> 
        <ItemTemplate> 
         <tr> 
          <td> 
           <asp:HiddenField ID="hidHardDrivesPackageDefaultID" runat="server" /> 
           <asp:HiddenField ID="hidHardDrivesPackageDefaultPrice" runat="server" /> 
           <span> 
            <asp:Label runat="server" ID="lbHardDiskPrice" Text="$00.00/mo"></asp:Label></span><label>Hard 
             Drive:</label><asp:DropDownList ID="ddHardDrive" DataTextField="ItemName" DataValueField="ProductItemID" runat="server" CssClass="lidropdown"> 
             </asp:DropDownList> 
           <asp:ImageButton runat="server" ID="ShowHarddriveInfo" ImageUrl="/_Images/server_configurator_helpbutton.png" 
            OnClick="lnkShowHarddriveInfo_OnClick" /></div> 
          </td> 
          <td align="right"> 
           <asp:Label runat="server" ID="lbHardDrivesPrice" /> 
          </td> 
         </tr> 
        </ItemTemplate> 
        <FooterTemplate> 
         </table> 
         <br /> 
        </FooterTemplate> 
       </asp:Repeater> 

バックエンド私は、リピーターにダイナミックな数のドロップダウンリストをロードしようとしていて、それらをすべて同じデータでデータバインドしようとしています。

public void PopulateHardDrives(int intSupportedDrives) 
    { 
    PreloadHardDriveRepeater(intSupportedDrives); 

    SqlConnection conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["connstrname"].ConnectionString); 
    SqlCommand cmd = new SqlCommand("Prod_SelectIDNamePriceByCategory", conn); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.AddWithValue("@CategoryCode", "Hard Drive"); 
    DataTable dtHardDrives = new DataTable(); 
    using (conn) 
    { 
     conn.Open(); 
     SqlDataReader dr = cmd.ExecuteReader(); 
     dtHardDrives.Load(dr); 
     ViewState.Add("dtHardDrives", dtHardDrives); 
    } 

    foreach (RepeaterItem riHardDrive in RepeaterHardDrives.Items) 
    { 
     DropDownList ddHardDrives = (DropDownList)riHardDrive.FindControl("ddHardDrives"); 
     ddHardDrives.DataSource = dtHardDrives;//program gives NULL exception error here(object not set to instance of object however it know the count of the rows it is supposed to be pulling) 
     ddHardDrives.DataValueField = "ProductItemID"; 
     ddHardDrives.DataTextField = "ItemName"; 
     ddHardDrives.DataBind(); 
     Label lbHardDrive = (Label)riHardDrive.FindControl("lbHardDrivesPrice"); 
     lbHardDrive.Text = String.Format("{0:c}", Convert.ToDecimal("0.00")); 
     if (riHardDrive.ItemIndex != 0) //We do not want to allow None to be selected on the main drive 
     { 
     ddHardDrives.Items.Insert(0, "None"); 
     } 
    } 
    } 

and last but not least the function to setup the dynamic amount of DDL's looks like this 

    private void PreloadHardDriveRepeater(int intSupportedDrives) 
    { 
     int[] intArrDisks = new int[intSupportedDrives]; 
     for (int intDiskCount = 0; intDiskCount < intArrDisks.Length; intDiskCount++) 
     { 
      intArrDisks[intDiskCount] = intDiskCount; 
     } 
     RepeaterHardDrives.DataSource = intArrDisks; 
     RepeaterHardDrives.DataBind(); 
    } 

の文とデータを取得していない唯一のドラウンリストで、このいずれかである場合、私は!page.isPostBackにおける移入関数のリストを呼び出しています。それはデータベースから行数(18)を取得しますが、Nullエラー(オブジェクト参照はオブジェクトのインスタンスに設定されません)を投げます。私は、かなりの数の人々が問題を抱いている間にこのエラーに遭遇しているのを見ましたしかし、私は私のために働く解決策を見つけることができませんでした。 PreloadHardDriveRepeater関数は、単独で実行すると正しい量のDDLをページにロードすると正常に動作するようです。

ありがとうございます。

答えて

1

あなたのコントロールは、「ddHardDrive」されています

<asp:DropDownList ID="ddHardDrive" DataTextField="ItemName" DataValueField="ProductItemID" runat="server" CssClass="lidropdown"> 

とあなたのコードは「ddHardDrives」

riHardDrive.FindControl("ddHardDrives"); 

を探しているあなたが関数にデバッグし、あなたを見ている場合に気づくのは簡単だろう例外がスローされる直前の変数値。

+0

私はうまくいきました。あなたの目を貸してくれてありがとう – h34dhun73r

関連する問題