C # asp.net Флажок в checkboxlist возвращает непроверенный всегда - PullRequest
0 голосов
/ 24 октября 2011

Я уже один день ломаю голову над этим. Но я просто не вижу этого.

У меня есть флажок с именем cblRounds, который

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

Также отметим, что EnableViewstate имеет значение true.

В моем коде позади, в page_Load я заполняю список следующим образом:

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 возвращает дату, которую я использую для фильтрации своей коллекции. Поэтому, когда я нажимаю кнопку поиска, я получаю «новые» флажки в своем списке. Вот почему я не имею Fillcheckboxlist внутри if (! IsPostBack), иначе я не получаю флажки при новом поиске.

Я искал ответ на этот вопрос и пробовал несколько вещей, но ни одна из них, похоже, не работает. Любые идеи приветствуются.

Ответы [ 4 ]

2 голосов
/ 24 октября 2011

Код события 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);
        }
    }

}
0 голосов
/ 02 декабря 2012

В ответ на исходный вопрос, взгляд здесь может кому-то помочь: -

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

Я успешно создал контрольный список, заполнил его значениями из БД, а затем после изменений обновил базу данных.

0 голосов
/ 06 июля 2012

Ваш вызов метода FillCheckBoxList() заполняет список при загрузке страницы, независимо от того, является ли это обратной передачей или нет.

Это означает, что вы переопределяете значения, отправленные обратно на сервер, так как код заполнения всегда выполняет это:

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

Вы хотите заполнить элементы CheckBoxList только в том случае, если это не обратная передача (т. Е. Только при первой загрузке страницы).

Когда этоpostback Коллекция Items в CheckBoxList уже заполнена самой обратной передачей из содержимого веб-страницы .Вам не нужно заполнять элемент управления при обратной передаче.

Вы просто хотите изменить загрузку страницы на:

protected void Page_Load(object sender, EventArgs e)
{

    if (!IsPostBack)
    {
        dpPrintRounds.FieldValue = DateTime.Now.AddDays(1);
        FillCheckBoxList(); 
    }
}
0 голосов
/ 24 октября 2011

Вы гарантировали, что это не из-за приведения к ListItem?Это не должно быть необходимым, но стоит попробовать ...

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

Также, если вы устанавливаете точку останова на место, где вы разыменовываете значение Selected, в каком оно состоянии?Может ли это быть проблемой из-за того, в какой точке жизненного цикла страницы вы связываете захваченные данные / пользовательское событие с тем, где вы пытаетесь получить выбранное значение?

...