Привязка данных SQL к выпадающим спискам в повторителях C # - PullRequest
0 голосов
/ 14 декабря 2010

Хорошо, ребята, поэтому я пытаюсь связать данные в раскрывающемся списке с C #. Я получаю нулевую ошибку при попытке ввести данные в DDL. Я использую этот код для внешнего интерфейса.

 <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) из базы данных, но выдает ошибку Null (ссылка на объект не установлена ​​для экземпляра объекта.) Я видел довольно много людей, сталкивавшихся с этой ошибкой при поиске проблемы Однако я не мог найти решение, которое работало для меня. Функция PreloadHardDriveRepeater, кажется, работает нормально, когда запускается одна, она загружает правильное количество DDL на страницу.

Спасибо заранее.

1 Ответ

1 голос
/ 14 декабря 2010

Ваш элемент управления "ddHardDrive":

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

и ваш код ищет "ddHardDrives"

riHardDrive.FindControl("ddHardDrives");

Это было бы легко заметить, если вы отладили функцию и посмотрели на значения переменных прямо перед тем, как возникнет исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...