2011-06-04 2 views
3

Я пытался создать специальную форму заявки. Я добавил некоторый элемент управления, например TextBox и Button, пока все изменится, пока я не модифицировал TextBox с помощью элемента управления DropDownList. Когда я нажимаю кнопку «Добавить», возвращается ошибка:Ошибка DropDownList 'не существует в списке элементов ASP.NET C#

«categoryDropDownList» имеет значение SelectedValue, которое недействительно, потому что оно не существует в списке элементов. Имя параметра: значение

Я приложил пример кода моего кода позади:

public partial class Test2 : System.Web.UI.Page 
    { 
     public string GetConnectionString() 
     { 
      return System.Configuration.ConfigurationManager.ConnectionStrings["LibrarySystemConnectionString"].ConnectionString; 
     } 

     private void execution(string bookid, string booktitle, string lastname, string firstname, string description, string categoryid, string dateadded, string quantity, string statusid) 
     { 
      SqlConnection conn = new SqlConnection(GetConnectionString()); 

      string sql = "INSERT INTO TblBooks(bookid, booktitle, lastname, firstname, description, categoryid, dateadded, quantity, statusid) VALUES "+" (@bookid, @booktitle,@lastname, @firstname, @description, @categoryid, @dateadded, @quantity, @statusid)"; 

      try 
      { 
       conn.Open(); 
       SqlCommand cmd = new SqlCommand(sql, conn); 
       SqlParameter[] pram = new SqlParameter[9]; 
       pram[0] = new SqlParameter("@bookid", SqlDbType.BigInt, 64); 
       pram[1] = new SqlParameter("@booktitle", SqlDbType.NVarChar, 50); 
       pram[2] = new SqlParameter("@lastname", SqlDbType.NVarChar, 50); 
       pram[3] = new SqlParameter("@firstname", SqlDbType.NVarChar, 50); 
       pram[4] = new SqlParameter("@description", SqlDbType.NVarChar, 200); 
       pram[5] = new SqlParameter("@categoryid", SqlDbType.Int, 32); 
       pram[6] = new SqlParameter("@quantity", SqlDbType.Int, 32); 
       pram[7] = new SqlParameter("@statusid", SqlDbType.Int, 32); 
       pram[8] = new SqlParameter("@dateadded", SqlDbType.DateTime, 32); 

       pram[0].Value = bookid; 
       pram[1].Value = booktitle; 
       pram[2].Value = lastname; 
       pram[3].Value = firstname; 
       pram[4].Value = description; 
       pram[5].Value = categoryid; 
       pram[6].Value = quantity; 
       pram[7].Value = statusid; 
       pram[8].Value = dateadded; 

       for (int i = 0; i < pram.Length; i++) 
       { 
        cmd.Parameters.Add(pram[i]); 
       } 
       cmd.CommandType = CommandType.Text; 
       cmd.ExecuteNonQuery(); 
      } 
      catch (System.Data.SqlClient.SqlException ex_msg) 
      { 

       string msg = "Error occured while inserting"; 
       msg += ex_msg.Message; 
       throw new Exception(msg); 
      } 

      finally 
      { 
       conn.Close(); 
      } 
      } 

     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 

     protected void Button1_Click(object sender, EventArgs e) 
     { 
      if (bookidTextBox.Text == "") 
      { 
       Response.Write("Please complete the form"); 
      } 

      else 
      { 
      execution(bookidTextBox.Text, booktitleTextBox.Text, lastnameTextBox.Text, firstnameTextBox.Text, descriptionTextBox.Text, categoryDropDownList.SelectedValue, dateaddedTextBox.Text, quantityTextBox.Text, statusDropDownList.SelectedValue); 
       //conform.Visible = true; 
       bookidTextBox.Text = ""; 
       booktitleTextBox.Text = ""; 
       lastnameTextBox.Text = ""; 
       firstnameTextBox.Text = ""; 
       descriptionTextBox.Text = ""; 
       categoryDropDownList.SelectedValue = ""; 
       dateaddedTextBox.Text = ""; 
       statusDropDownList.SelectedValue = ""; 
       quantityTextBox.Text = ""; 

      } 
     } 
    } 
} 

Вот пример кода формы:

<table class="style1"> 
    <tr> 
     <td class="style2"> 
      ISBN: 
      </td> 
      <td class="style3"> 
      <asp:TextBox ID="bookidTextBox" runat="server" Text='<%# Bind("bookid") %>'> 
      </asp:TextBox> 
      </td> 
      <td> 
      <asp:RequiredFieldValidator ID="RequiredFieldValidator" runat="server" ControlToValidate="bookidTextBox" ErrorMessage="* " ValidationGroup="addbooks"> 
      </asp:RequiredFieldValidator> 
     </td> 
    </tr> 

<tr> 
<td class="style2"> 
Title: 
</td> 
<td class="style3"> 
<asp:TextBox ID="booktitleTextBox" runat="server" Text='<%# Bind("booktitle") %>'> 
</asp:TextBox> 
</td> 
<td> 
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="booktitleTextBox" ErrorMessage="* " ValidationGroup="addbooks"> 
</asp:RequiredFieldValidator> 
</td> 
</tr> 

... (cut some code here) 

<tr> 
<td class="style2"> 
Category: 
</td> 
<td class="style3"> 
    <asp:DropDownList ID="categoryDropDownList" runat="server" 
     DataSourceID="categoryDataSource" DataTextField="name" 
     DataValueField="categoryid" > 
    </asp:DropDownList> 
    <asp:SqlDataSource ID="categoryDataSource" runat="server" 
     ConnectionString="<%$ ConnectionStrings:LibrarySystemConnectionString %>" 
     SelectCommand="SELECT [categoryid], [name] FROM [TblCategory]"> 
    </asp:SqlDataSource> 
</td> 
</tr> 

... 

<tr> 
<td class="style2"> 
Status:</td> 
<td class="style3"> 
    <asp:DropDownList ID="statusDropDownList" runat="server" 
     DataSourceID="statusDataSource" DataTextField="statusname" 
     DataValueField="statusid" > 
    </asp:DropDownList> 
    <asp:SqlDataSource ID="statusDataSource" runat="server" 
     ConnectionString="<%$ ConnectionStrings:LibrarySystemConnectionString %>" 
     SelectCommand="SELECT [statusid], [statusname] FROM [BookStatus]"> 
    </asp:SqlDataSource> 
</td> 
</tr> 

</table> 
</div> 

<asp:Button ID="AddBtn" runat="server" Text="Add" OnClick="Button1_Click" Width="100px" /> 
<br /> 
<br /> 

<b>Book List</b> 
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="bookid" DataSourceID="bookDataSource"> 
    <Columns> 
     <asp:BoundField DataField="bookid" HeaderText="bookid" ReadOnly="True" 
      SortExpression="bookid" /> 
     <asp:BoundField DataField="booktitle" HeaderText="booktitle" 
      SortExpression="booktitle" /> 
     <asp:BoundField DataField="lastname" HeaderText="lastname" 
      SortExpression="lastname" /> 
     <asp:BoundField DataField="firstname" HeaderText="firstname" 
      SortExpression="firstname" /> 
     <asp:BoundField DataField="categoryid" HeaderText="categoryid" 
      SortExpression="categoryid" /> 
     <asp:BoundField DataField="description" HeaderText="description" 
      SortExpression="description" /> 
     <asp:BoundField DataField="dateadded" HeaderText="dateadded" 
      SortExpression="dateadded" /> 
     <asp:BoundField DataField="statusid" HeaderText="statusid" 
      SortExpression="statusid" /> 
     <asp:BoundField DataField="quantity" HeaderText="quantity" 
      SortExpression="quantity" /> 
     <asp:CheckBoxField DataField="isdeleted" HeaderText="isdeleted" 
      SortExpression="isdeleted" /> 
    </Columns> 
</asp:GridView> 

Он работал, когда я пытаюсь конвертировать DropDownList в текстовое поле, но как я могу связать его с элементом управления DropDownList?

Помощь была бы очень признательна! Заранее спасибо.

+4

Пожалуйста, не вывешивает стены кода. Сократите свою проблему до ее сути, наименьший возможный фрагмент, демонстрирующий поведение. Вы получите ответы быстрее, и эти ответы будут лучше. –

+0

Ошибка указывает на то, что вы пытаетесь установить выпадающее окно Dropdown для значения, которое не существует в элементах, которые вы указываете в раскрывающемся списке. Прежде чем вы сделаете что-то выбранное значение, сначала убедитесь, что оно находится в коллекции .Items. – Tridus

+0

Это связано с установкой выбранного значения на "". Я предполагаю, что у вашего источника данных нет данных в наборе записей, который является «". –

ответ

3

Ваш DropDown связан с SqlDataSource. Когда вы выполняете categoryDropDownList.SelectedValue = "", DropDown ищет пустое значение в источнике данных, но не может найти его, поэтому он терпит неудачу.

Если вы хотите запустить dropDownList.ClearSelection(), если это то, чего вы пытаетесь достичь.

Здесь упрощен пример кода, который продемонстрировал бы вопрос

protected void Page_Load(object sender, EventArgs e) 
{ 
    var items = new[] { new { Id = 1, Name = "Test1" }, new { Id = 2, Name = "Test2" } }; 

    dropDownList.DataSource = items; 
    dropDownList.DataValueField = "Id"; 
    dropDownList.DataTextField = "Name"; 
    dropDownList.DataBind(); 
} 

protected void Button1_Click(object sender, EventArgs e) 
{ 
    dropDownList.SelectedValue = ""; // trhows exception 
    dropDownList.ClearSelection(); // works 
} 
+1

Используйте свойство страницы IsPostBack, чтобы гарантировать, что DataBinding происходит один раз на запрос страницы. – adatapost

Смежные вопросы