如何在 !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" />
我知道还有其他主题涵盖了这个问题,但没有一个建议的解决方案对我有用。提前感谢您的投入。
【问题讨论】:
你真的需要AutoPostBack
true
吗?
我从某个模板复制/粘贴了我的行,这就是我拥有它的原因。即使去掉那部分也不能解决我的问题。
检查页面或母版页的视图状态未设置为 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 中?的主要内容,如果未能解决你的问题,请参考以下文章