2011-08-02 97 views
0

我創建了一個asp.net應用程序,該應用程序使用來自數據庫的信息填充表,並在下拉列表中選擇一個值並更新數據庫。出於某種原因,現在當我轉到下一個日期並且所有信息都正確顯示時,但下拉列表中的值沒有顯示。正因爲如此,假設第一頁有3行,第二頁有10頁。第二頁的前3行與下一頁的下拉列表具有相同的值,但其他所有內容都會更改。下面是用於在每一行創建下拉列表代碼:下拉列表不清除

tc = new TableCell(); 
        tc.BorderWidth = 1; 
        String rteNum = reader.GetValue(fCount - 1).ToString().TrimStart('R'); 

        //this output displays the correct value 
        System.Diagnostics.Trace.WriteLine(rteNum.Trim()); 

        ddl = new DropDownList(); 
        ddl.ID = "route" + index; 
        ddl.Attributes["runat"] = "server"; 
        ddl.Attributes["onblur"] = "refresh()"; 

        ListItem item; 
        for (int i = 1; i <= 32; i++) 
        { 
         item = new ListItem(); 
         item.Text = i.ToString(); 
         item.Value = i.ToString(); 
         if (i.ToString().Equals(rteNum.Trim())) 
         { 
          item.Selected = true; 
         } 
         ddl.Items.Add(item); 

        } 
        list.Add(ddl); 

        tc.Controls.Add(ddl);    
        tc.ID = "tblr" + index; 
        tr.Cells.Add(tc); 

        tbl1.Rows.Add(tr); 

編輯:

問題是我需要的,如果用戶按下一個按鈕,使用更改後的值,但是當數據改變了信息必須被丟棄。所以基本上我需要用下拉列表顯示信息然後更新數據庫。

+0

線 「ddl.Attributes [」 RUNAT 「] = 」服務器「,」因爲它只是將該屬性發送給客戶端,所以什麼都不做。手動創建控制時,不需要添加runat。 –

回答

0

一種方法是做到這一點的加價是這樣的:

<asp:DropDownList ID="ddl_1" runat="server" AutoPostBack="True" 
    DataSourceID="ds_1" DataTextField="myText" 
    DataValueField="myValue" /> 

    <asp:SqlDataSource ID="ds_1" runat="server" 
     ConnectionString="<%$ ConnectionStrings:myConnection %>" 
     <!--this is if you use a stored procedure--> 
     SelectCommand="dbo.myProcedure" SelectCommandType="StoredProcedure"> 
     <!--this is if you use direct sql (less secure -- be careful with parameters)--> 
     SelectCommand="SELECT field1 as myValue, field2 as myText FROM myTable"> 
    </asp:SqlDataSource> 

所以,當你想設置基於數據庫值的選定值(以響應按鈕單擊等,你可能會使用這樣子在你的後臺代碼:

Private Sub SELECT_whatever() 
     Dim myCommand As New SqlCommand("dbo.SELECT_whatever", myConnection) 
     With myCommand 
      .CommandType = CommandType.StoredProcedure 
      With .Parameters 
       .Clear() 
       .AddWithValue("myParameter", me.txtwhateverfield.text) 
      End With 
     End With 
     Try 
      myConnection.Open() 
      myReader = myCommand.ExecuteReader 
      While myReader.Read 
       If Not IsDBNull(myReader("field1")) Then 
        Me.ddl_instructor.SelectedValue = myReader("field1") 
       End If 
       Me.lbl_RecordID.Text = "Record ID: " & myReader("recordID") 
       -- etc. -- for all of the textboxes, labels, etc. on your page 
      End While 
     Catch ex As Exception 
      Response.Write(ex.Message) 
     Finally 
      myConnection.Close() 
     End Try 

作爲替代使用標記了datasoruce控制,你可以使用子上面,而是......

  1. 創建一個數據集
  2. 創建一個數據適配器
  3. .fill僞調用數據適配器在數據表中設置
  4. 設置的下拉列表中的數據源到數據表
  5. 呼叫.databind( )在下拉列表中。

下面是一個例子:http://support.microsoft.com/kb/306574(CTRL + F爲 「數據綁定」 - 它在向下項目4)

0

這聽起來像你期待你的DropDownList中的32 option項中的一個被選中。懷疑rteNum.Trim()沒有到32

確切的值設爲1,調試這一點,嘗試確定的rteNum

//pre-trim this val. 
string rteNum = reader.GetValue(fCount - 1).ToString().TrimStart('R').Trim(); 
... 

ddl.Attributes["name"] = rteNum; //a random place/attr show the value of rteNum 
ddl.Attributes["runat"] = "server"; 
ddl.Attributes["onblur"] = "refresh()"; 
.... 
item.Value = i.ToString(); 
item.Selected = (i.ToString()==rteNum); 

值查看源頁面呈現找到的值後您的DropDownList的名稱屬性。與1-32進行比較。

0

不是批評,但只是作爲一個觀察...

你做了很多工作來填充,然後還同步您的下拉列表。你不需要使用datareader作爲中間人。你可以直接進入數據源。調用數據綁定()可以填充列表,而不是從您的數據讀取器逐行插入。

如果您對這種方法感興趣,我可以提供一些示例代碼。

否則,就像@ p.cambell所說的那樣,正如您當前所做的那樣,只有當rteNum具有值時纔會設置您選擇的屬性。

+0

rteNum始終有一個值。我很想看看databind()的一個例子,如果你能爲我安裝它的話。 – user776530

+0

行 - 會做.. – Chains