2010-06-28 1 views
0

В качестве обходного пути для того, что asp: Checkboxes не имеет значений, я пытаюсь динамически создавать идентификаторы флажков в DataList, чтобы он вставлял первичные ключи в идентификатор управления. Это удивительно сложно.Создание динамических элементов управления DataList с идентификаторами на основе связанных данных

Я поместил PlaceHolder в свой ItemTemplate DataList, а затем в ItemCreated создаю флажки с помощью string.Format("Checkbox{0}", DataBinder(e.Item.DataItem, "ID")). Проблема в том, что это работает только в состоянии без обратной передачи, так как при обратной передаче DataItem имеет значение null. И, конечно, ItemDataBound не вызывается в PostBack, так что это тоже не сработает.

Я не могу найти хороший способ справиться с этим if (IsPostback) dataList.Bind(), который я не думаю, что это хороший способ сделать это.

Может ли кто-нибудь предоставить мне какие-либо альтернативы здесь?

EDIT:

Дополнительная информация. Я просто понял, что часть проблемы связана с тем, что на самом деле у меня есть DataList в DataList. Причина, по которой DataItem имеет значение null, заключается в отсутствии привязки данных при обратной передаче, а дочерние данные не сохраняются в viewstate.

В принципе, я делаю это This, хотя использует DataList, а не ретранслятор. Таким образом, при обратной передаче коллекция «Дети» не устанавливается, потому что ItemDataBound не вызывается для обратной передачи.

EDIT2: Чтобы прояснить проблему, в основном из-за вложенных данных. Я должен установить источник данных вложенного datalist в поле коллекции из отдельных строк отдельных строк данных. На обратной стороне нет привязки данных, поэтому она не работает.

ответ

1

Вы можете использовать аналогичную технику для той, которую я написал в this answer, - добавьте регулярную CheckBox и элемент управления HiddenField в ItemTemplate и привяжите HiddenField к значению первичного ключа, например.

<ItemTemplate> 
    <tr> 
     <td> 
      <asp:CheckBox runat="server" ID="MyCheckBox" AutoPostBack="true" oncheckedchanged="MyCheckBox_CheckedChanged" /> 
      <asp:HiddenField runat="server" id="DatabaseKeyHiddenField" Value='<%# Eval("DatabaseKey") %>' /> 
     </td> 
    </tr> 
</ItemTemplate> 

protected void MyCheckBox_CheckedChanged(object sender, EventArgs e) 
{ 
    CheckBox selectedCheckBox; 
    DataListItem selectedDataListItem; 
    HiddenField databaseKeyHiddenField; 
    string databaseKey; 

    // Cast the sender object to a CheckBox 
    selectedCheckBox = (CheckBox)sender; 

    // Walk up the tree one level so we get the container for both controls 
    selectedDataListItem = (DataListItem)selectedCheckBox.Parent; 

    // Get the HiddenField control ... 
    databaseKeyHiddenField = (HiddenField)selectedDataListItem.FindControl("DatabaseKeyHiddenField"); 

    // ... and read the value 
    databaseKey = databaseKeyHiddenField.Value; 

    // Go off and do a database update based on the key we now have 
    ... 
} 

Это немного обходной путь, а не точно то, что вы хотите сделать, но это работает!

+0

Хотя ваше решение будет работать в одном DataList, оно не работает для вложенного. Проблема в том, что второй список данных создается динамически, затем его элементы управления создаются динамически. И вы должны установить источник данных для второго справочника по каталогу, что означает, что он не будет сериализован в viewstate. Таким образом, при обратной передаче нет источника данных для установки. –

+0

На самом деле, я был неправ. Этот подход позволяет мне удалить созданный флажок для создания кода и позволить шаблону сделать это, таким образом, он будет сериализован при обратной передаче. Не идеальное решение, но оно работает. –

Смежные вопросы