2011-06-04 20 views
3

カスタムアプリケーションフォームを作成しようとしていました。 TextBoxとButtonのようなコントロールをいくつか追加しましたが、これまでDropDownListコントロールでTextBoxの一部を変更するまでは問題ありません。追加ボタンをクリックすると、エラーが返されます。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

このエラーは、ドロップダウンのSelectedValueを、ドロップダウンに配置した項目に存在しない値に設定しようとしていることを示しています。選択した値を作成する前に、まずそれが.Itemsコレクションにあることを確認する必要があります。 – Tridus

+0

選択した値を ""に設定する必要があります。私は、あなたのデータソースが ""であるレコードセット内のデータを持っていないと推測しています。 –

答えて

3

DropDownSqlDataSourceにバインドされています。 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がページ要求ごとに1回発生するようにします。 – adatapost

関連する問題