回发后从webservice重置DropdownList

时间:2014-06-06 10:42:43

标签: c# asp.net

我的列表是通过网络服务电话填充的。

如果我逐行手动填充列表,则确定。我可以选择项目并返回选择项目没有问题,例如

List<ListItem> oList = new List<ListItem>();

oList.Add(new ListItem("User", "0"));
oList.Add(new ListItem("Manager", "1"));

cboUsers.DataSource = oList

这不实用,因为我要绑定的列表是Dynamic,例如

cboUsers.DataSource = MyWebService.GetUsers() // returns List<ListItem>

无论我在代码中做什么,我都无法从列表中获取所选项目,列表总是重置自己。

这两项代码都包含在

if (!IsPostBack) 

但是当列表绑定到Web服务时,无论我做什么(ViewState,Session any),列表总是在回发后重置,我永远无法正确获取所选项目。

我已经尝试了页面上的每个属性组合,代码中的控件和标记中的任何组合,并且没有任何效果。我在这里和其他网站上查看了很多文章,但没有一个例子有效。

任何帮助都将不胜感激。

[编辑]

完整代码如下。 (cboAccess,按预期手动填充工作正常) (cboDept将填充并显示,但之后我无法从中获取选择)

从下拉列表中选择(cboDept),然后单击“添加”按钮(cmdAdd),使用我的Web服务将列表中的文本选择添加到我的数据库中。无论我选择什么,选择总是显示为第一项。

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            AttendanceWebServices.Service1Client oServices = new AttendanceWebServices.Service1Client();

            List<ListItem> oList = new List<ListItem>();
            oList.Add(new ListItem("Normal User", "0"));
            oList.Add(new ListItem("Manager", "10"));

            cboAccess.DataTextField = "Text";
            cboAccess.DataValueField = "Value";
            cboAccess.DataSource = oList;
            cboAccess.DataBind();

            cboDept.DataSource = oServices.GetTeamGroups().ToList();
            cboDept.DataValueField = "Value";
            cboDept.DataTextField = "Text";
            cboDept.DataBind();
        }
    }

    protected void cmdAdd_Click(object sender, EventArgs e)
    {
        AttendanceWebServices.Service1Client oServices = new AttendanceWebServices.Service1Client();

        string sDept = ((ListItem)cboDept.SelectedItem).Text;

        oServices.AddNewUser(sDept);
    }
}

[EDIT2 - HTML]

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="adduser.ascx.cs" Inherits="AttendanceWeb2.adduser" %>
<style type="text/css">
    .style1
    {
        width: 100%;
    }
</style>
<p>
    &nbsp;</p>

<asp:scriptmanager runat="server" id="scm1">
</asp:scriptmanager>

<table class="style1">
    <tr>
        <td>
            Name</td>
        <td>
            <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
        </td>
    </tr>
    <tr>
        <td>
            Department</td>
        <td>
            <asp:updatepanel runat="server">
                <ContentTemplate>
                    <asp:DropDownList ID="cboDept" runat="server">
                    </asp:DropDownList>
                </ContentTemplate>
                <triggers>
                    <asp:AsyncPostBackTrigger ControlID="cmdAdd" />
                </triggers>
            </asp:updatepanel>
        </td>
    </tr>
    <tr>
        <td>
            Employee ID</td>
        <td>
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        </td>
    </tr>
    <tr>
        <td>
            Access Level</td>
        <td>
<asp:dropdownlist runat="server" id="cboAccess"></asp:dropdownlist>
        </td>
    </tr>
    <tr>
        <td>
            &nbsp;</td>
        <td>
            <asp:Button ID="cmdAdd" runat="server" onclick="cmdAdd_Click" Text="Add" 
                Width="100px" />
&nbsp;<asp:Button ID="cmdDelete" runat="server" onclick="cmdDelete_Click" Text="Delete" 
                Width="100px" />
        </td>
    </tr>
    <tr>
        <td>
            &nbsp;</td>
        <td>
            &nbsp;</td>
    </tr>
</table>

[编辑3] - 简化版(仍然不起作用)

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="AttendanceWeb2._default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <asp:DropDownList ID="cboDept" runat="server"></asp:DropDownList>
    <asp:Button ID="cmdAdd" runat="server" Text="Add" Width="100px" 
            onclick="cmdAdd_Click" />
    </div>
    </form>
</body>
</html>

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            AttendanceWebServices.Service1Client oServices = new AttendanceWebServices.Service1Client();

            cboDept.DataSource = oServices.GetTeamGroups().ToList();
            cboDept.DataValueField = "Value";
            cboDept.DataTextField = "Text";
            cboDept.DataBind();
        }

    }

    protected void cmdAdd_Click(object sender, EventArgs e)
    {
        ListItem oItem = cboDept.SelectedItem;

        string sText = oItem.Text;
        string sValue = oItem.Value;
    }

1 个答案:

答案 0 :(得分:0)

确保EnableViewState控件的True设置为cboDept

修改

将你的桌子放在form内。例如:

<form id="form1" runat="server">
    <asp:DropDownList ID="DropDownList1" runat="server">
    </asp:DropDownList>
    <asp:Button type="submit" ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
</form>