1

这是我屏幕的一部分: 我的屏幕

用户可以从下拉列表中选择一个选项,然后单击添加按钮。这是添加按钮的代码:

    protected void btnModuleAdd_Click(object sender, EventArgs e)
    {   
        var selectedModule = ddlModsList.SelectedItem.ToString();
        var graphicName = this.GraphicName;

        var xr = new GraphicModuleXRef();
        xr.GraphicName = graphicName;
        xr.Module = selectedModule;

        // Take drop down list selection and add it to GraphicModuleXRef table.
        var context = new XRefDataContext();
        context.GraphicModuleXRefs.InsertOnSubmit(xr);
        context.SubmitChanges();
    }

基本上,它接受用户的选择并将其写到表格中。这部分工作正常。

在我的 Page_Load 中,我检查是否 IsPostback,如果是,我运行以下代码:

private void LoadOtherModulesUsed()
    {
        if (this.GraphicName != null)
        {
            lbModules.Items.Clear();
            var context = new XRefDataContext();
            var q = context.GraphicModuleXRefs
                           .Where(a => a.GraphicName.Contains(this.GraphicName));

            foreach (GraphicModuleXRef gr in q)
            {
                lbModules.Items.Add(new ListItem(gr.Module.ToString()));
            }
        }
    }

此代码从表中读取,查找与条件匹配的所有记录,并将它们添加到列表框中。

所以,我期望发生的是重新加载页面并重新填充列表框,包括刚刚添加到表中的新条目。但是,这并没有发生。屏幕像重新加载一样刷新,但条目没有出现在列表框中。然而,它就在那里,只是看不见而已。如果用户添加另一个条目,通过单击“添加”按钮,列表会“向上滚动”一行,并且可以看到前一个条目。但是,不是新的。如果用户退出屏幕并重新进入,则可以看到列表框中的所有条目。几乎就像列表框太短而无法显示所有记录,但我尝试了不同的高度,没有区别。

我想知道是否有人可以指出我正确的方向?

简而言之,当向列表框添加新项目时,除非添加另一个项目,否则它不会立即可见,从而“滚动”列表。在添加另一个条目之前,即使使用滚动条滚动列表也不会显示新条目。而且,如果您向上滚动列表,您可以看到先前的条目。这么奇怪!

编辑:试图更简单地描述这一点:

  1. 用户通过按添加按钮将项目添加到列表框。
  2. 新项目不会出现在列表框中。
  3. 用户通过按添加按钮将另一个项目添加到列表框。
  4. 如果用户向上滚动列表框,则先前的项目现在显示在列表框中。
  5. 但是,除非重复第 3 步,否则不会出现刚刚添加的最新项目。
  6. 此外,退出页面然后返回加载列表中的每个项目并且所有项目都是可见的。
4

1 回答 1

1

这是一个时间问题。发生的事情是 Page_Load 在这种情况下首先运行,然后 Click 事件处理程序在添加新条目之前有效地绑定了控件。这就是为什么你总是落后一个刷新。我会像这样重构您的代码,以便一切都以正确的顺序运行!要了解事件执行的时间安排,我强烈建议您阅读 MSDN 上的这篇文章,它真棒,它将真正帮助您充分利用 ASP.NET。

另外阅读 MSDN 上的这篇文章(也很棒),尤其是 ViewState 部分将解释 DropDown 如何保留其详细信息,即使在修改后的代码中,您仅在页面不是回发并且单击事件是时才填充它被解雇了。

希望这可以帮助!

public void Page_Load(object sender, EventArgs e)
{
   if (IsPostBack) return;
   LoadOtherModulesUsed();
}

private void LoadOtherModulesUsed()
{
    if (this.GraphicName != null)
    {
        lbModules.Items.Clear();
        var context = new XRefDataContext();
        var q = context.GraphicModuleXRefs
                       .Where(a => a.GraphicName.Contains(this.GraphicName));

        foreach (GraphicModuleXRef gr in q)
        {
            lbModules.Items.Add(new ListItem(gr.Module.ToString()));
        }
    }
}

protected void btnModuleAdd_Click(object sender, EventArgs e)
{   
    var selectedModule = ddlModsList.SelectedItem.ToString();
    var graphicName = this.GraphicName;

    var xr = new GraphicModuleXRef();
    xr.GraphicName = graphicName;
    xr.Module = selectedModule;

    // Take drop down list selection and add it to GraphicModuleXRef table.
    var context = new XRefDataContext();
    context.GraphicModuleXRefs.InsertOnSubmit(xr);
    context.SubmitChanges();
    LoadOtherModulesUsed();
}
于 2013-04-25T19:29:52.350 回答