获取C# ASP中下拉列表的值时避免回发(postback)

3

我已经在C#中动态创建了一个下拉列表(不在aspx中使用代码):

DropDownList myDDL = new DropDownList();

当页面刷新时,pageLoad()不会被调用,因此无法从其中调用该函数。但是,每次另一个dll的OnPostback(OnSelectedIndexChanged())被调用时,该函数都会被加载,因此我不能使用!IsPostBack


当:

  • A value of another dropdownlist populates a GridView using OnSelectedIndexChanged()

    <asp:DropDownList id ="select1" name="assignGetForm"  runat="server" class="selectClass" AutoPostBack="True" OnSelectedIndexChanged="populateGridView">
    
  • On the GridView a function is run OnRowDatabound()(when the above OnIndexChanged() populates it) to populate myDDL inside the GridView

    <asp:GridView id="GridView1" name="GridView1" onrowdatabound="populateCellsDDL" runat="server"></asp:GridView>
    

我现在正在尝试使用按钮的 onclick() 事件访问 myDDL 中的值 - 然而这总是会进行页面回发并刷新页面,所以 myDDL 会消失,并且当我将值打印到控制台时,它只会给出我的第一个值 select activity,而不是我实际选择的值。

当这个 dll 没有在 pageLoad() 上填充时,我该如何获取这些值。 我尝试过查看 AJAX,但我不确定如何通过它查看 c# 值。我还尝试了 viewstates,但我没有成功,因为它也没有在 pageLoad() 上填充。


你看过Page.IsPostBack属性吗?https://msdn.microsoft.com/zh-cn/library/system.web.ui.page.ispostback(v=vs.110).aspx。你可以检查页面是否正在进行回发并防止重新加载。 - Riv
是的,如果我在按钮绑定中包含!ispostback,它不会绑定,因为我正在另一个ddl上发布回来..但不是pageload。然后,当我按下按钮获取我的值(DDL.SelectedValue)时,它会发布回来,因此失去了创建的DDL,因为它们没有在pageload上填充!这一切都在循环中哈哈 - db0016
1个回答

1

如果您想访问动态创建控件的值,则需要在每个 postback 中重新绑定网格。

我尝试使用以下示例代码模拟情况,并成功访问了该值。

ASPX 代码:

<asp:DropDownList ID="select1" name="assignGetForm" runat="server" class="selectClass" AutoPostBack="True" />
<asp:GridView ID="GridView1" name="GridView1" OnRowDataBound="GridView1_DataBound" runat="server" />
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />

C#后端代码

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
        FillMainDll();

    if (!IsPostBack || GridView1.Rows.Count > 0)
        BindGrid();
}

private void FillMainDll()
{
    select1.DataSource = new int[] { 1, 2, 3 };
    select1.DataBind();
}

private void BindGrid()
{
    var dt = new DataTable();

    dt.Columns.Add(new DataColumn("ID", typeof(Int32)));
    dt.Columns.Add(new DataColumn("Name", typeof(string)));

    for (int i = 1; i < 5; i++)
    {
        DataRow dr = dt.NewRow();

        dr[0] = i;
        dr[1] = "Name - " + i.ToString();

        dt.Rows.Add(dr);
    }

    GridView1.DataSource = dt;
    GridView1.DataBind();
}

protected void GridView1_DataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        var myDDL = new DropDownList();
        myDDL.ID = "myDDL";
        myDDL.DataSource = GetGridRowDdlData();
        myDDL.DataBind();
        e.Row.Cells[1].Controls.Add(myDDL);
    }
}

private IEnumerable<string> GetGridRowDdlData()
{
    var data = new List<string>();

    for (int i = 1; i < 4; i++)
    {
        data.Add("Name - " + i * int.Parse(select1.SelectedValue));
    }

    return data;
}

protected void Button1_Click(object sender, EventArgs e)
{
    var sb = new System.Text.StringBuilder();

    foreach (GridViewRow row in GridView1.Rows)
    {
        var myDDL = row.FindControl("myDDL") as DropDownList;
        if (myDDL != null)
        {
            sb.AppendFormat("{0}<br/>", myDDL.SelectedValue);
        }
    }

    Response.Write(sb.ToString());
}

有道理,绑定网格以便触发行数据绑定事件。我会查看回复并了解它的工作原理,谢谢! - db0016

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接