Добавить новый элемент в уже привязанный ListView в ASP Net (невозможно установить DataKeys/FieldName)

Моя общая цель - добавить поддельные/несвязанные элементы в элемент управления списком (для окончательных причин вывода HTML-таблицы). Это код позади решения. Пользователи не будут добавлять элементы, так как они будут выводиться в жесткой таблице.

Я просмотрел несколько примеров, и хотя это легко для раскрывающегося списка, это не для просмотра списка.

Приведенный ниже код работает без ошибок, но мой элемент не отображается во время выполнения. Я думаю, что класс неправильно устанавливает имя поля элемента, но я не могу понять правильный синтаксис, чтобы исправить это.

ColumnNameAList.DataSource = PeriodDataView
ColumnNameAList.DataBind()

Dim test As New Example1("ColumnNameA")

Dim newItem As New ListViewDataItem(ColumnNameAList.Items.Count, ColumnNameAList.Items.Count)
newItem.DataItem = test

ColumnNameAList.Items.Insert(ColumnNameAList.Items.Count, newItem)
ColumnNameAList.Items.Add(newItem)

Вот класс Example1, который должен устанавливать DataValueField:

Public Class Example1
Public Sub New(ColumnNameA__1 As String)
    ColumnNameA = ColumnNameA__1
End Sub

Private m_ColumnNameA As String

Public Property ColumnNameA() As String
    Get
        Return m_ColumnNameA
    End Get
    Set(value As String)
        m_ColumnNameA = value
    End Set
End Property

End Class

Это выводит мой исходный список источников данных, но не добавленный элемент.

<ItemTemplate>
    <td>
        <%# Eval("ColumnNameA")%>

    </td>
</ItemTemplate>

person Ariesto    schedule 19.12.2011    source источник
comment
В какой момент вы вызываете свой код вставки? Он должен выполняться как прослушиватель на ListView.DataBound, иначе привязка данных очистит все элементы, которые вы заполнили вручную.   -  person lsuarez    schedule 20.12.2011
comment
Я работаю в чужом коде, и у них есть настраиваемый подпрограмма, в которой затем вызывается ColumnNameAList.DataBind(). Я разместил код ручной вставки в том же подразделе после строки ColumnNameAList.DataBind(). Я предположил, что, поскольку я изменяю список после привязки данных, эти изменения будут сохранены.   -  person Ariesto    schedule 20.12.2011
comment
Пользовательский саб, о котором я упоминал выше, находится в области Page_PreRender.   -  person Ariesto    schedule 20.12.2011


Ответы (3)


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

Dim MyOriginalTableSource As Data.DataView = DataManager.example()
Dim ModifiedTable As DataTable = MyOriginalTableSource.ToTable
'do stuff here
Mylistbox.DataSource = ModifiedTable
Mylistbox.DataBind()

Не всем подойдет, но в данном случае мне подходит.

person Ariesto    schedule 27.01.2012

Может возникнуть несколько проблем с тем, как вы подходите к этому, в том числе с тем, что ListView уже привязан к данным и что вы одновременно добавляете и вставляете новый элемент.

Когда у нас есть такой сценарий, мы используем один из двух подходов:

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

2) Удалите привязку данных и вручную создайте каждый из элементов представления списка, а затем добавьте новый элемент в начале или конце цикла.

person competent_tech    schedule 19.12.2011
comment
Похоже, мне придется следовать подходу № 2 и добавлять их вручную, потому что я пытаюсь вставить элементы и изменить порядок списка. Есть ли у вас краткие примеры того, как выполнять обратные передачи, если вы вручную создаете список элементов в списке? - person Ariesto; 20.12.2011

Другой способ сделать это - ввести его в sql.

select col1, col2, col3 from table1 union select '1','2','3'

это гарантирует, что элемент всегда будет добавлен, и asp.net не нужно знать или заботиться.

Вы можете добавить это в запрос sql или добавить его из скрытого кода перед запросом привязки. если вы не привязываетесь к sql, вы также можете сделать это с любым элементом списка с помощью LINQ

person Sam Sussman    schedule 19.12.2011