ASP.NET - Listbox中的SelectedValue / Index在回发后总是在变化

时间:2017-04-23 21:44:40

标签: c# asp.net

我几天来一直在努力解决这个问题,到目前为止我还没有找到适合这个问题的答案。这是在PageLoad()中加载列表的代码:

protected void Page_Load(object sender, EventArgs e)
        {         
            if(!IsPostBack)
            {                
                lstEmprendimientos.DataSource = Emprendimiento.DevolverEmprendimientosConEvaluacionesIncompletas();
                lstEmprendimientos.DataValueField = "id";
                lstEmprendimientos.DataTextField = "titulo";
                lstEmprendimientos.DataBind();
                pnlEvaluador.Visible = false;       
            }
        }

第一种方法加载由'Emprendimiento'对象组成的列表,并在该列表的SelectedIndexChanged上调用另一种方法,通过使用所选项目的SelectedValue的方法加载列表。

我的问题是,无论我做什么,在回发后SelectedIndex总是重置为0,所以我无法正确使用SelectedValue加载第二个列表。我已经在列表上工作了很长一段时间,而且我从来没有遇到过这个问题,所以真是令人费解。我很感激你的帮助。

以下是整个页面的代码:

    protected void Page_Load(object sender, EventArgs e)
    {         
        if(!IsPostBack)
        {                
            ddlEmprendimientos.DataSource = Emprendimiento.DevolverEmprendimientosConEvaluacionesIncompletas();
            ddlEmprendimientos.DataValueField = "id";
            ddlEmprendimientos.DataTextField = "titulo";
            ddlEmprendimientos.DataBind();
            pnlEvaluador.Visible = false;       
        }
    }

    protected void lstEmprendimientos_SelectedIndexChanged(object sender, EventArgs e)
    {

    }

    protected void lstEvaluadores_SelectedIndexChanged(object sender, EventArgs e)
    {
        Evaluador ev = Evaluador.FindByID(lstEvaluadores.SelectedValue);
    }

    protected void btnAsignarEvaluador_Click(object sender, EventArgs e)
    {            
        Emprendimiento emp = Emprendimiento.FindByID(Convert.ToInt32(ddlEmprendimientos.SelectedValue));
        Evaluador ev = Evaluador.FindByID(lstEvaluadores.SelectedValue);
        Evaluacion eva = new Evaluacion(emp, ev, 0, "justificacion", DateTime.Now, false);
        if (eva != null)
        {
            if (eva.Insertar())
            {
                lblFeedback.Text = "Alta exitosa.";
                emp.listaEvaluaciones.Add(eva);
                lstEvaluadores.DataSource = emp.DevolverListaEvaluadoresQueNoEvaluanEmprendimiento();
                lstEvaluadores.DataTextField = "Nombre";
                lstEvaluadores.DataValueField = "Email";
                lstEvaluadores.DataBind();
                pnlEvaluador.Visible = true;
                CargarEvaluadores();
            }
            else
            {
                lblFeedback.Text = "Error en el ingreso de datos.";
            }
        }
        else
        {
            lblFeedback.Text = "Error en el ingreso de datos.";
        }
    }

    protected void btnSeleccionarEmp_Click(object sender, EventArgs e)
    {
         CargarEvaluadores();
    }

    private void CargarEvaluadores()
    {
        Emprendimiento emp = Emprendimiento.FindByID(Convert.ToInt32(ddlEmprendimientos.SelectedIndex));
        lstEvaluadores.DataSource = emp.DevolverListaEvaluadoresQueNoEvaluanEmprendimiento();
        lstEvaluadores.DataTextField = "Nombre";
        lstEvaluadores.DataValueField = "Email";
        lstEvaluadores.DataBind();
        pnlEvaluador.Visible = true;
    }

    protected void ddlEmprendimientos_SelectedIndexChanged(object sender, EventArgs e)
    {
        CargarEvaluadores();
    }

页面标记:

<%Page Title =“”Language =“C#”MasterPageFile =“〜/ masterPage.Master”AutoEventWireup =“true”CodeBehind =“asignarEvaluador.aspx.cs”Inherits =“InterfazUsuario.asignarEvaluador”>

<asp:DropDownList ID="ddlEmprendimientos" runat="server" OnSelectedIndexChanged="ddlEmprendimientos_SelectedIndexChanged">
</asp:DropDownList>
<br />
<br />
<asp:Button ID="btnSeleccionarEmp" runat="server" OnClick="btnSeleccionarEmp_Click" Text="Seleccionar emprendimiento" Width="195px" />
<br />
<br />
<asp:Panel ID="pnlEvaluador" runat="server">
    <asp:ListBox ID="lstEvaluadores" runat="server" OnSelectedIndexChanged="lstEvaluadores_SelectedIndexChanged"></asp:ListBox>
    <br />
    <br />
    <asp:Button ID="btnAsignarEvaluador" runat="server" OnClick="btnAsignarEvaluador_Click" Text="Asignar evaluador" Width="135px" />
    <br />
    <br />
    <asp:Label ID="lblFeedback" runat="server"></asp:Label>
    <br />
</asp:Panel>

2 个答案:

答案 0 :(得分:0)

您需要将DropDownList和ListBox控件更改为AutoPostback

<强>的DropDownList

<asp:DropDownList ID="ddlEmprendimientos" runat="server" 
    OnSelectedIndexChanged="ddlEmprendimientos_SelectedIndexChanged" 
    AutoPostBack="True">
</asp:DropDownList>

<强>列表框

<asp:ListBox ID="lstEvaluadores" runat="server" 
    OnSelectedIndexChanged="lstEvaluadores_SelectedIndexChanged"
    AutoPostBack="True">
</asp:ListBox>

的AutoPostBack:

  

如果服务器需要捕获选择,请将此属性设置为 true   一旦制成。例如,网页上的其他控件可以   根据用户从列表中的选择自动填充   控制。

     

此属性可用于允许在&gt;上自动填充其他控件。基于用户从列表中选择的网页。

     

此属性的值存储在视图状态中。

https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.listcontrol.autopostback(v=vs.110).aspx

答案 1 :(得分:0)

我再次检查完所有内容后发现了问题。

列表中的DataValueField是'id',并且'Emprendimiento'类中的id字段未定义,因此它总是返回null int(0)。谢谢你的帮助,最后只是一个愚蠢的错误。