下拉列表不清楚

时间:2011-08-02 22:33:17

标签: asp.net html

我创建了一个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);

编辑:

问题是如果用户按下按钮,我需要使用更改的值,但是当数据被更改时,必须删除信息。所以基本上我需要用下拉列表显示信息然后更新数据库。

3 个答案:

答案 0 :(得分:0)

听起来您期望选择DropDownList中的32个option项之一。怀疑rteNum.Trim()的确切值不是1到32。

要对此进行调试,请尝试确定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的name属性的值。将其与1-32进行比较。

答案 1 :(得分:0)

不要批评,而是作为观察......

您正在进行大量工作以填充,然​​后同步您的下拉列表。您不需要使用datareader作为中间人。您可以直接转到数据源。调用databind()可以填充列表,而不是从datareader中逐行插入。

如果您对此方法感兴趣,我可以提供一些示例代码。

否则,正如@ p.cambell所说,当你正在进行此操作时,只有在rteNum有值时才会设置所选属性。

答案 2 :(得分: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()。
  6. 以下是一个例子:http://support.microsoft.com/kb/306574(“数据绑定”的CTRL + F - 在第4项中显示)