我创建了一个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 :(得分: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控件的替代方法,您可以使用上面的子,但是......
以下是一个例子:http://support.microsoft.com/kb/306574(“数据绑定”的CTRL + F - 在第4项中显示)