Я также опубликовал это на форумах DevExpress, но вы не можете превзойти stackoverflow для хороших ответов.
Кажется, у меня проблема с элементом управления DevExpress AspxComboBox.
Я использую элементы управления DevExpress 9.1.11 с Visual Studio 2008.
Вот мои элементы управления:
<asp:LinqDataSource ID="ContactsDataSource" runat="server"
ContextTypeName="DAL.MorrisDataContext"
Select="new (Id, FullName)"
TableName="Contact">
</asp:LinqDataSource>
<dxe:ASPxComboBox ID="SignerComboBox" runat="server" ToolTip="Select a Contact to use."
AutoPostBack="True" DataSourceID="ContactsDataSource" TextField="FullName"
ValueField="Id" ValueType="System.String" Width="140px" SelectedIndex="0">
</dxe:ASPxComboBox>
Я обрабатываю событие Selecting в LinqDataSource, чтобы отфильтровать список элементов, используемых в ComboBox, следующим образом:
Protected Sub ContactsDataSource_Selecting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.LinqDataSourceSelectEventArgs) Handles ContactsDataSource.Selecting
Dim Contacts As IList(Of Contact) = iEntity.Contacts.ToList
e.Result = Contacts
End Sub
iEntity.Contacts - это просто объект LINQtoSQL, содержащий дочернюю коллекцию объектов LINQtoSQL, известную как «Контакты». Все это прекрасно работает.
Проблема возникает, когда я пытаюсь добавить новый контакт в коллекцию контактов для сущности, а затем пытаюсь обновить ComboBox, чтобы отразить добавление следующим образом:
Private Sub SignerUpdate()
Dim m_Last = SignerContactLastTextBox.Text
Dim m_First = SignerContactFirstTextBox.Text
If m_Last <> "" OrElse m_First <> "" Then
Dim m_Middle = SignerContactMiddleTextBox.Text
Dim m_Suffix = SignerContactSuffixTextBox.Text
Dim m_ContactIndex As Int32 = SignerComboBox.SelectedIndex
Dim m_Contact As Contact = New Contact
If m_Last <> "" Then m_Contact.LastName = New Identifier With {.Value = m_Last}
If m_First <> "" Then m_Contact.FirstName = New Identifier With {.Value = m_First}
If m_Middle <> "" Then m_Contact.MiddleName = New Identifier With {.Value = m_Middle}
If m_Suffix <> "" Then m_Contact.Suffix = New Identifier With {.Value = m_Suffix}
iEntity.Contacts.Add(m_Contact)
SignerComboBox.DataBind()
SignerComboBox.SelectedIndex = SignerComboBox.Items.Count - 1
'SignerComboBox.SelectedIndex = 3
Else
SignerContactSuffixTextBox.ErrorText = "Must have First or Last name."
SignerContactSuffixTextBox.IsValid = False
End If
End Sub
Ключевые строки:
iEntity.Contacts.Add(m_Contact)
SignerComboBox.DataBind()
SignerComboBox.SelectedIndex = SignerComboBox.Items.Count - 1
'SignerComboBox.SelectedIndex = 3
Первая строка добавляет новый контакт в коллекцию.
Вторая строка связывает ComboBox, что приводит к запуску события Selecting сверху и получению обновленного списка, включая новый контакт.
Все по-прежнему работает нормально. Я могу поставить часы на SignerCombBox.Items и увидеть, что новый элемент находится после привязки. Этого не было до привязки.
Все хорошо.
Затем мы подходим к третьей строке. Вот где у нас проблема. Я ожидаю, что это выберет последний элемент в списке элементов. Результаты SignerComboBox.Items.Count верны. Мы получаем счет обратно, который включает в себя новый элемент.
Что не работает, так это то, что когда мы пытаемся использовать этот результат для установки свойства SelectedIndex. Это не примет это.
В четвертой строке я попытался сделать все вручную, чтобы не потерять рассудок. Оказывается, я не. Как видите, эта строка закомментирована.
Несмотря на то, что я добавил еще одну строку в Items, я вижу эту строку в Items. Его нельзя установить как выбранное с помощью SelectedIndex. Когда я пытаюсь установить его, он просто остается равным тому, что было установлено ранее (в моем случае 0). Я также пытался установить его с помощью SignerComboBox.SelectedItem = SignerComboBox.Items (SignerComboBox.Items.Count - 1) или SignerComboBox.SelectedItem = SignerComboBox.Items (3) безрезультатно.
Так, например. С моими тестовыми данными я начинаю с 3 предметов в коллекции. 0 - 2 в пунктах.
На данный момент я могу установить SignerComboBox.SelectedIndex на 0, 1 или 2. Это работает просто отлично.
Затем я добавляю еще один элемент.
Повторите, чтобы получить обновленные предметы.
Проверьте предметы. Теперь они содержат 4 предмета. 0, 1, 2 и 3
Установить SignerComboBox.SelectedIndex = 3. Это не будет работать. Он останется равным 0. Даже если я знаю, что этот элемент находится в списке элементов элемента управления.
Установите SignerComboBox.SelectIndex = 2. Работает просто отлично. Будет установлено значение 2.
Это как если бы он решал, является ли это действительный индекс, основанный на чем-то, кроме его собственного списка Предметов.
Я даже попытался вставить новый список выше и использовать уже существующий индекс. Однако, как только это будет сделано, этот индекс не будет принят.
Я действительно не понимаю этого. Я почти уверен, что это ошибка. Даже это не имеет особого смысла для меня, потому что это похоже на ошибку, о которой уже сообщалось уже миллион раз. Поэтому я могу только предположить, что, возможно, это как-то связано с тем, что я обрабатываю событие Selecting источника данных и выдаю ему произвольный результат. Я не понимаю, почему это имеет значение, но я не вижу, как что-то еще является наименьшим из числа необычного.
Я уже давно размышляю над этой проблемой, и у меня нет идей. Поэтому любая помощь будет принята с благодарностью.
Спасибо,
Тори
EDIT:
Я подумал, что, может быть, смогу сформулировать вопрос немного более кратко.
Вот к чему это сводится:
Свяжите комбинированный список с источником LinqDataSource на основе объекта LinqToSql, который
как дочерний объект связан с другим объектом LinqToSql.
Создание экземпляра родительского объекта.
Используйте событие LinqDataSource.Selecting, чтобы использовать содержимое
Коллекция дочерних объектов экземпляра родительского объекта, как результат
LinqDataSource в форме IList (Of ChildObject).
Показать содержимое ComboBox.
Добавление нового дочернего объекта в коллекцию дочерних объектов родительского объекта.
экземпляр объекта.
Снова привязать данные в ComboBox, чтобы забрать вновь добавленные
член коллекции.
Попытка установить SelectedIndex ComboBox в индекс
вновь созданный элемент его содержимого, используя что-то вроде этого:
SignerComboBox.SelectedIndex = SignerComboBox.Items.Count - 1
Вы не сможете.
Он будет отображаться в списке ComboBox.Items, но вы не сможете
назначить его индекс свойству SelectedIndex.