ASPX post back问题与组合框

本文关键字:组合 问题 post back ASPX | 更新日期: 2023-09-27 18:10:00

我创建了一个简单的ASPX页面,在GridView中列出记录。记录是事件列表,其中一列是报告事件的人的ID。

初始页面显示所有记录,但我想为ReportedBy列提供一个过滤器。通过允许用户在文本框中输入ReportedByID,然后单击提交按钮,我实现了这个功能。这将使用过滤后的视图按预期刷新页面。

本页的代码如下:

public MyPage()
{
    this.Load += new EventHandler(Page_Load);
}
protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack == false)
    {
        DataAccessObj daObj = new DataAccessObj();
        IncidentGrid.DataSource = daObj.GetIncidentsByReportedById(0);
        IncidentGrid.DataBind();
    }
}
protected void btnSubmit_Click(object sender, EventArgs e)
{
    int reportedById = 0;
    if (int.TryParse(txtReportedById.Text, out reportedById) == false)
    {
        reportedById = 0;
    }
    DataAccessObj daObj = new DataAccessObj();
    IncidentGrid.DataSource = daObj.GetIncidentsByReportedById(reportedById);
    IncidentGrid.DataBind();
}

为了使用户更友好,我决定添加一个下拉框,其中填充了ReportedBy名称,供用户选择,然后在单击提交按钮时使用该下拉框进行过滤。下拉框的名称作为显示项,但值仍应设置为id。

我的问题是,我从下拉框中得到的ID号总是作为列表的第一个元素出现,而不是用户在点击提交按钮时选择的那个。

此页的实现代码如下:

public MyPage()
{
    this.Load += new EventHandler(Page_Load);
}
protected void Page_Load(object sender, EventArgs e)
{
    DataAccessObj daObj = new DataAccessObj();
    foreach (ReportedByItem repByItem in daObj.GetAllReportedBy())
    {
        ListItem listItem = new ListItem(repByItem.Name, repByItem.Id.ToString());
        combobox.Items.Add(listItem);
    }
    if (IsPostBack == false)
    {
        IncidentGrid.DataSource = daObj.GetIncidentsByReportedById(0);
        IncidentGrid.DataBind();
    }
}
protected void btnSubmit_Click(object sender, EventArgs e)
{
    int reportedById = 0;
    if (combobox.SelectedItem != null)
    {
        if (int.TryParse(combobox.SelectedItem.Value, out reportedById) == false)
        {
            reportedById = 0;
        }
    }
    DataAccessObj daObj = new DataAccessObj();
    IncidentGrid.DataSource = daObj.GetIncidentsByReportedById(reportedById);
    IncidentGrid.DataBind();
}

任何帮助将不胜感激。TIA

ASPX post back问题与组合框

请记住,对于WebForms, Page_Load代码是在创建回发的控件的事件处理程序代码之前执行的。

您必须在检查回发标志的部分填充列表,就像您对网格所做的那样。

if (IsPostBack == false){
    //bind the combobox
}

否则,在回发时,列表将重新填充,所选内容将消失。

protected void Page_Load(object sender, EventArgs e)
{   
    if (!Page.IsPostBack)
    {
        DataAccessObj daObj = new DataAccessObj();
        foreach (ReportedByItem repByItem in daObj.GetAllReportedBy())
        {
            ListItem listItem = new ListItem(repByItem.Name, repByItem.Id.ToString());
            combobox.Items.Add(listItem);
        }
        IncidentGrid.DataSource = daObj.GetIncidentsByReportedById(0);
        IncidentGrid.DataBind();
    }
}