复选框中的C#asp.net复选框始终返回未选中状态

时间:2011-10-24 07:05:48

标签: c# asp.net checkbox checkboxlist

我现在已经在这一天打破了一天。 但我只是没有看到它。

我有一个名为cblRounds的复选框列表

<asp:CheckBoxList ID="cblRondes" runat="server">
</asp:CheckBoxList>

另外需要注意的是,EnableViewstate设置为true。

在我的代码后面,在page_Load中我填写de list,如下所示:

protected void Page_Load(object sender, EventArgs e)
{

    if (!IsPostBack)
    {
        dpPrintRounds.FieldValue = DateTime.Now.AddDays(1);

    }
    FillCheckBoxList(); 
}

private void FillCheckBoxList()
{
    tourCollectie = new LogisticsTourCollection();
    RelationCollection rc = new RelationCollection(LogisticsItemEntity.Relations.LogisticsItemSpecsEntityUsingSeqSpecs);
    rc.Add(LogisticsItemSpecsEntity.Relations.LocationEntityUsingSeqLocationDelivery);
    rc.Add(LocationEntity.Relations.LocationLogisticsTourEntityUsingSeqLocation);
    rc.Add(LocationLogisticsTourEntity.Relations.LogisticsTourEntityUsingSeqLogisticsTour);
    PredicateExpression pe = new PredicateExpression(LogisticsItemSpecsFields.RequiredDeliveryDate == dpPrintRounds.FieldValue);
    pe.Add(LogisticsItemFields.DeliveryNumber != DBNull.Value);
    tourCollectie.GetMulti(pe, rc);

    cblRondes.Items.Clear();
    foreach (LogisticsTourEntity tour in tourCollectie)
    {
        cblRondes.Items.Add(new ListItem(tour.Name, tour.SeqLogisticsTour.ToString()));
    }        
}

然后我点击一个按钮,在那里我查看复选框的检查状态

protected void btnPrintHeaders_Click(object sender, EventArgs e)
{
    PrintRounds();
}

private void PrintRounds()
{
    if (dpPrintRounds.Date_Selected.HasValue)
    {            
        Dictionary<string, string> rondes = new Dictionary<string, string>();
        foreach (ListItem item in cblRounds.Items)
        {
            if (item.Selected)
            {
                rondes.Add(item.Value, GetDeliveryNumberFromRonde(item.Value));
            }
        }            


    }
}

除了if(item.Selected)总是返回false之外,一切正常。

我也有

<td>
            <rm:DatePicker ID="dpPrintRounds" runat="server" />
        </td>
        <td>
            <asp:Button ID="btnSearch" runat="server" Visible="true" 
                onclick="btnSearch_Click" />
            <%--<asp:Literal ID="litLogisticsRoundName" runat="server" />:--%>
        </td>

Datepicker返回我用来过滤我的集合的日期。 因此,当我按下搜索按钮时,我的复选框列表中会出现“新”复选框。 这就是为什么我没有if(!IsPostBack)里面的Fillcheckboxlist,否则我没有新搜索的复选框。

我一直在寻找这方面的答案并尝试了几件事,但似乎都没有效果。 任何想法都表示赞赏。

4 个答案:

答案 0 :(得分:2)

Page_Load事件代码必须包装在IsPostBack块中。

if(!IsPostBack)
{
  foreach (LogisticsTourEntity tour in tourCollection)
    {
        cblRounds.Items.Add(new ListItem(tour.Name, tour.SeqLogisticsTour.ToString()));
    }
}

演示:

标记

<form id="form1" runat="server">
    <asp:CheckBoxList 
            ID="cblRounds" 
            runat="server">
    </asp:CheckBoxList>
    <asp:Button 
            ID="Button1" 
            runat="server" 
            Text="Button" onclick="Button1_Click" />

</form>

代码隐藏

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
    for (int i = 1; i <= 10; i++)
    {
        cblRounds.Items.Add(new ListItem("Text" + i ,i.ToString()));
    }
}
}
protected void Button1_Click(object sender, EventArgs e)
{
PrintRounds();
}
private void PrintRounds()
{
    Dictionary<string, string> rondes = new Dictionary<string, string>();
    foreach (ListItem item in cblRounds.Items)
    {
        if (item.Selected)
        {
            rondes.Add(item.Text , item.Value);
            Response.Write("<br/> " + item.Text + " " + item.Value);
        }
    }

}

答案 1 :(得分:0)

您确定它不是由于投射到ListItem吗? 不应该但是值得一试......

for (int i = 0; i < cblRounds.Items.Count; i++)
{
   if (cblRounds.Items[i].Selected)
     //do your stuff
}

此外,如果您将断点设置为取消引用Selected值的地方,它的状态是什么?这可能是一个问题,在页面生命周期的哪个阶段,您正在捕获绑定的数据/用户事件与您尝试获取所选值的位置?

答案 2 :(得分:0)

您的方法调用FillCheckBoxList()会在页面加载时填充列表框,无论是否为回发。

这意味着您将覆盖发回服务器的值,因为您的填充代码始终执行此操作:

cblRondes.Items.Clear();
foreach (LogisticsTourEntity tour in tourCollectie)
{
    cblRondes.Items.Add(new ListItem(tour.Name, tour.SeqLogisticsTour.ToString()));
}

您只想填充CheckBoxList的项目,如果它不是回发(即仅在首次加载页面时)。

当它是回发时,CheckBoxList的Items集合已经由回页本身从网页内容填充。您不必在回发时填充控件。

您只想将page_load更改为:

protected void Page_Load(object sender, EventArgs e)
{

    if (!IsPostBack)
    {
        dpPrintRounds.FieldValue = DateTime.Now.AddDays(1);
        FillCheckBoxList(); 
    }
}

答案 3 :(得分:0)

回答原来的问题,看看这里可能会对某人有所帮助: -

http://aspdotnetcodebook.blogspot.co.uk/2008/08/how-to-add-checkboxlist-dynamically.html

我已成功动态创建了一个checkboxlist,用db中的值填充它,然后在更新后更新了数据库。