如何在 !Page.IsPostBack 之后将我的项目保存在 asp:dropdownlist 中?

Posted

技术标签:

【中文标题】如何在 !Page.IsPostBack 之后将我的项目保存在 asp:dropdownlist 中?【英文标题】:How do I keep my items in asp:dropdownlist after !Page.IsPostBack? 【发布时间】:2022-01-16 03:20:21 【问题描述】:

我通过调用存储过程将值/文本列表加载到 asp:dropdownlist 中。我在 !Page.IsPostBack 块内填充 PageLoad 方法的下拉列表,如下所示:

if (!Page.IsPostBack)

     GetDropDownLists();
     DataBind();

这是我的后端代码实现:

protected void GetDropDownLists()

     DataTable dt = new DataTable();

     SqlConnection conn = new SqlConnection(connString);
     SqlCommand cmd = new SqlCommand("get_articletype", conn);
     cmd.CommandType = CommandType.StoredProcedure;
     SqlDataAdapter adapter = new SqlDataAdapter(cmd);
               
     adapter.Fill(dt);
     xArticleTypeList.Items.Clear();
     xArticleTypeList.Items.Insert(0, new ListItem("- Select.. -", "0"));
     xArticleTypeList.SelectedIndex = 0;
     xArticleTypeList.DataSource = dt;
     xArticleTypeList.DataValueField = "TypeValue";
     xArticleTypeList.DataTextField = "TypeName";
     xArticleTypeList.DataBind();

如果我的代码不在 !Page.IsPostBack 块中,则在我单击保存按钮后,默认值将始终是下拉列表的第一项。但是,一旦我将代码放入 !Page.IsPostBack 块中,我的下拉列表就是空的。这里的参考是我的 asp:dropdownlist 的前端实现。

<asp:DropDownList ID="xArticleTypeList" EnableViewState="true" AutoPostBack="true" CssClass="form-control" runat="server" />

我知道还有其他主题涵盖了这个问题,但没有一个建议的解决方案对我有用。提前感谢您的投入。

【问题讨论】:

你真的需要AutoPostBacktrue吗? 我从某个模板复制/粘贴了我的行,这就是我拥有它的原因。即使去掉那部分也不能解决我的问题。 检查页面或母版页的视图状态未设置为 false 我已经检查过了,无论是母版页还是此代码所在的当前页都没有将视图状态设置为 false。 default value will always be the first item of the dropdownlist.my dropdownlist is empty 你在哪里检查这个? 【参考方案1】:

您的问题是您插入空白请在绑定之前选择行。结果,当您绑定时,您将下拉下拉菜单。

试试这个方法:

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


    void LoadData()
    
        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
        
            using (SqlCommand cmd = new SqlCommand("get_articletype", conn))
            
                DataTable dt = new DataTable();
                cmd.CommandType = CommandType.StoredProcedure;
                conn.Open();
                dt.Load(cmd.ExecuteReader());

                xArticleTypeList.DataSource = dt;
                xArticleTypeList.DataValueField = "TypeValue";
                xArticleTypeList.DataTextField = "TypeName";
                xArticleTypeList.DataBind();

                xArticleTypeList.Items.Insert(0, new ListItem("- Select.. -", "0"));
            
        
    

并且 GET RID 你的额外调用 re-bind 你有这个:

 GetDropDownLists();
 DataBind();   <--- remove unless you need, or execute BEFORE the GetDropDownList()

因此,将您的添加/插入空白行移动到下拉数据绑定之后。​​

并删除你的 DataBind() - 你不需要它,如果由于某种原因你需要它,那么将 DataBind() 移动到加载 GetDropDownLists() 之前 - 但我猜你只是扔了那个希望完成这项工作,它会导致组合框重新选择 - 所以删除,除非你给出一个非常好的高质量大纲和叙述为什么你在那里有 DataBin() 命令 - (但作为请注意,如果您真的,但确实确实需要执行该 DataBind() 命令 - 将其移至组合加载之前)。

所以,在后面添加空白行

【讨论】:

你的回答帮助我弄清楚我做错了什么 - 我应该在我的代码中添加,为了进入 ddl,我必须点击一个按钮,在页面最终加载完毕。但这让我意识到,通过将隐藏面板的可见性从 false 设置为 true,页面会重新加载并丢失我的所有数据。你对我的空白选择项目也是正确的。由于您的回答使我发现了我的错误,因此我将您的回答作为解决方案投票。谢谢! 请记住,通常最好使用 style="display:none" 或 style = "display:normal" 来隐藏或显示控件。请记住,如果您将“div”或“grid”或任何控件设置为 visible = false,则它不会呈现并且不会发送到客户端浏览器。这意味着任何客户端 js 都无法隐藏/显示该控件,因为它从未被渲染并发送到浏览器。如果您尝试使用客户端代码将 visible = true 设置为 true,甚至在某些情况下代码隐藏,那么您通常会发现它不起作用,因为控件未呈现并设置为客户端浏览器。

以上是关于如何在 !Page.IsPostBack 之后将我的项目保存在 asp:dropdownlist 中?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET中IsPostBack详解

ASP.NET中IsPostBack详解

ASP.NET中IsPostBack详解

ASP.NET中IsPostBack详解

APS.NET webform中的isPostBack

Page_Load()被多次调用(对于页面中使用的每个JS文件一次)和Page.IspostBack为FALSE