2011-08-02 48 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