在将视图切换为多视图的一部分时获取控制值

时间:2011-04-28 20:52:32

标签: c# asp.net

我的aspx页面中有以下代码:

<asp:Button id="display_button" runat="server" Text="Display" OnClick="Button1_Click" /> &nbsp;
<asp:Button id="edit_button" runat="server" Text="Edit" OnClick="Button2_Click" /> &nbsp; 
<asp:Button id="save_button" runat="server" Text="Save" OnClick="Button3_Click" Visible="false" /> &nbsp; 

<asp:MultiView id="MultiView1" runat="server" ActiveViewIndex="0">
    <asp:View id="View1" runat="server">
        <asp:FormView id="view_program" runat="server"> 
        <ItemTemplate>
            <%# Eval("status").ToString().Trim() %>
        </ItemTemplate>
        </asp:FormView>
    </asp:View>
    <asp:View id="View2" runat="server">
        <asp:FormView id="edit_program" runat="server"> 
        <ItemTemplate>
            <asp:DropDownList id="p_status" runat="server">
            </asp:DropDownList>
        </ItemTemplate>
        </asp:FormView>
    </asp:View>
</asp:MultiView>  

以及代码隐藏页面中按钮的以下功能:

protected void Button1_Click(object sender, EventArgs e)
{
    MultiView1.SetActiveView(View1);
    save_button.Visible = false;
}

protected void Button2_Click(object sender, EventArgs e)
{
    MultiView1.SetActiveView(View2);
    save_button.Visible = true;
}

protected void Button3_Click(object sender, EventArgs e)
{
    DropDownList p_status = edit_program.FindControl("p_status") as DropDownList;
    var status = p_status.SelectedValue;
    Label1.Text = status;
    //save_button.Visible = false;
    //MultiView1.SetActiveView(View1);
}

这个想法是,有两个视图,第一个显示信息,如果用户想要编辑信息,他们点击按钮2,将视图更改为编辑模式,编辑模式具有控件(下拉菜单,文本田野等)。它还会显示“保存”按钮。

我想要做的是,当单击保存按钮时,它将从各个字段中获取所有值,更新对象,然后更新数据库。然后它将使用更新的信息翻转回view1。

问题是,正如您在void Button3_Click中看到的那样,我尝试从控件p_status中获取值,但它只获取原始值。例如,菜单有三个值,“绿色”,“黄色”和“红色”。绿色是默认值,在显示view2时选择。但是,如果我选择黄色或红色,然后单击保存,而不是更新标签以显示这两个值中的一个,它始终显示绿色。

有什么想法吗?

编辑:每个请求下面的页面加载功能

protected void Page_Load(object sender, EventArgs e)
{
    try
    {
    Person myPerson = new Person(userid);
    TestProgram myProgram = new TestProgram(id);

    List<TestProgram> program = new List<TestProgram> { myProgram };

    view_program.DataSource = program;
    view_program.DataBind();
    edit_program.DataSource = program;
    edit_program.DataBind();


    DropDownList p_status = edit_program.FindControl("p_status") as DropDownList;
    p_status.Items.Add(new ListItem("Green", "Green"));
    p_status.Items.Add(new ListItem("Yellow", "Yellow"));
    p_status.Items.Add(new ListItem("Red", "Red"));
    //myProgram.Status = "Red";
    p_status.SelectedValue = myProgram.Status;

    }
    catch (Exception ex)
    {
    Response.Write(ex);
    Label1.Text = ex.ToString();

    }

}

1 个答案:

答案 0 :(得分:0)

  哎呀...错过了一点点......我的   坏

当asp.net的行为不符合预期时,这是你最好的朋友:MSDN: ASP.NET PAGE LIFECYLE

进一步审核......

这里有几个问题。 ID为“p_status”的下拉列表控件包含在多视图中(我忘记了这意味着......)您需要移动代码以在检查后将p_status填充到预渲染中看看Multiveiw1.ActiveView = View2。因为它总是回发,所以你需要在页面循环的后期绑定值