2010-12-14 52 views
0

好吧,所以我试图将数据绑定到c#的下拉列表中。尝试将数据输入到DDL时出现空错误。我正在使用此代码作为前端。中继器中的数据绑定到下拉列表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填入功能的列表if语句,并且没有得到数据的唯一一个这是一个与淹没列表。它从数据库中获得行数(18),但它会抛出一个空错误(对象引用未设置为对象实例)。我看到不少人在搜索问题时遇到了这个错误,但是我找不到适合我的解决方案。 PreloadHardDriveRepeater函数在单独运行时似乎工作正常,它会将正确数量的DDL加载到页面上。

提前致谢。

回答

1

你的控制是“ddHardDrive”:

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

和你的代码是寻找“ddHardDrives”

riHardDrive.FindControl("ddHardDrives"); 

这将是很容易发现,如果你调试到功能,看着你在抛出异常之前的变量值。

+0

大声笑很好,工作很好(难怪没有我发现的例子工作)。谢谢你借给我你的眼睛 – h34dhun73r 2010-12-14 20:47:57