【问题标题】:foreach CheckBoxList always not checkedforeach CheckBoxList 始终未选中
【发布时间】:2013-01-24 21:08:40
【问题描述】:

所以基本上,我的目标是做一个简单的循环,在提交时检查是否有一堆框在继续之前被选中。我知道如何在 PHP 或 MVC 中做到这一点,但我的老板强迫我使用 web 控件。

所以,我们到了。

Default.aspx中的相关代码

<div>
    <asp:CheckBoxList id="eligibilityreqs" runat="server">
        <asp:ListItem value="item1" runat="server">I am great</asp:ListItem>
        <asp:ListItem value="item2" runat="server">I am amazing.</asp:ListItem>
        <asp:ListItem value="item3" runat="server">I completed EVERTHING</asp:ListItem>
        <asp:ListItem value="item4" runat="server">Pies are delicious</asp:ListItem>
        <asp:ListItem value="item5" runat="server">Oh man a fifth one</asp:ListItem>
    </asp:CheckBoxList>
</div>
<p>
    <asp:Label Text="" id="finalmessage" runat="server" />
</p>
<div>
    <asp:Button Text="Submit" runat="server" onclick="process" />
</div>

Default.aspx 的代码隐藏

using System;
using System.Web;
using System.Web.UI;
using System.Data;
using System.Web.Configuration;
using System.Data.Odbc;
using System.Web.UI.WebControls;

namespace minor
{
    public partial class Default : System.Web.UI.Page
    {
        protected void process (object sender, EventArgs e)
        {
            bool valid = true;
            string debugtext = "";
            foreach (ListItem li in eligibilityreqs.Items) {
                if (!li.Selected) {
                    valid = false;
                    debugtext = debugtext + li.Selected;
                }
            }
            if (!valid) {
                finalmessage.Text = "There has been an error, please check all boxes." + debugtext;
            } else {
                string conString = WebConfigurationManager.ConnectionStrings ["connectionstring"].ConnectionString;
                using (OdbcConnection con = new OdbcConnection(conString)) {
                    string sqlstring = "SELECT yum FROM pie_application LIMIT 1;";
                    using (OdbcCommand com = new OdbcCommand(sqlstring, con)) {
                        con.Open ();
                        string reader = Convert.ToString (com.ExecuteScalar ());
                        finalmessage.Text = reader;
                    }
                }
            }
        }
    }
}

debugtext 的输出仅供参考,假,假,假,假,假。

【问题讨论】:

  • 您如何、何时以及从何处对CheckBoxList 进行数据绑定?
  • Lani,你能在bool valid = true 上方添加这一行,但在这一行之后添加一个断点,然后检查你是否得到一个已检查项目的列表? List&lt;ListItem&gt; items = eligibilityreqs.Items.Cast&lt;ListItem&gt;().Where(n =&gt; n.Selected).ToList();
  • 我刚刚注意到另一个潜在问题,我会将string reader = Convert.ToString (com.ExecuteScalar ()); 更改为var reader = (string)com.ExecuteScalar();

标签: c# web-controls checkboxlist listitem asp.net-webcontrol


【解决方案1】:

我的猜测是,即使在回发时,您也会对 CheckBoxList 进行数据绑定。这将取消选择所有选定的项目。

所以检查IsPostBack 属性。

protected void Page_Load(Object sender, EventArgs e)
{
    if(!IsPostBack)
    {
        DataBindCheckBoxList();
    }
}

【讨论】:

  • 可能是 Tim。但是如果没有看到 Page_Load 和或其他关于如何调用方法的代码,就无法真正说出任何事情。它来自 Button_Click 吗?...等。 . 如果是这样,那么你的答案将是一个有效/极有可能的问题是什么
  • @DJKRAZE:是的,该方法是从按钮调用的(参见 aspx)。我的回答只是猜测,因为 OP 缺乏 ASP.NET 经验。这是新手常见的问题。因为他没有发布 page_load 我假设他不知道这个属性;)
  • @Time Schmelter 我完全同意.. 我不是在质疑你的回答。我认为很多人不理解 WinForms 中的 PostBack 与按钮点击,希望 OP 给出某种响应或确认
  • 她,实际上。我们不要假设。是的,我是 webcontrol 模型的新手。我已经完成了 MVC3 并且我已经完成了大量的 PHP。不是这种“让我们为你写所有的 HTML”webcontrol 讨厌的超级粉丝。嗯...也就是说,我不确定数据绑定 x.x。按钮单击没有让我获得列表的提交信息是否有特殊原因?如果我要获得简单文本框的值,它可以工作。可以想象,由于两者都有名称并以表格形式提交,因此它们都可以同样容易地获得。
  • @LaniAlden:如果您发布的代码是完整的,我的回答将无济于事。我刚刚猜到您正在从 page_load 中对控件(例如从数据库中选择的项目)进行数据绑定。由于此事件发生在页面生命周期的早期,它会使用旧选择更改用户的选择。这就是为什么我使用Page.IsPostBack 属性来确定这是第一次加载还是回发。
【解决方案2】:

原来这是一个已知的单声道错误。对于那些感兴趣的人,可以更新 mono 或构建它,假设它可以工作,然后部署。

或者,只需编写更好的代码并完全避免使用 Web 控件...如果您的老板允许您这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    相关资源
    最近更新 更多