Настройка AspxComboBox.SelectedIndex не работает после использования LinqDataSource.Selecting.Есть идеи? - PullRequest
1 голос
/ 15 июля 2011

Я также опубликовал это на форумах 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: Я подумал, что, может быть, смогу сформулировать вопрос немного более кратко.

Вот к чему это сводится:

  1. Свяжите комбинированный список с источником LinqDataSource на основе объекта LinqToSql, который как дочерний объект связан с другим объектом LinqToSql.

  2. Создание экземпляра родительского объекта.

  3. Используйте событие LinqDataSource.Selecting, чтобы использовать содержимое Коллекция дочерних объектов экземпляра родительского объекта, как результат LinqDataSource в форме IList (Of ChildObject).

  4. Показать содержимое ComboBox.

  5. Добавление нового дочернего объекта в коллекцию дочерних объектов родительского объекта. экземпляр объекта.

  6. Снова привязать данные в ComboBox, чтобы забрать вновь добавленные член коллекции.

  7. Попытка установить SelectedIndex ComboBox в индекс вновь созданный элемент его содержимого, используя что-то вроде этого:

    SignerComboBox.SelectedIndex = SignerComboBox.Items.Count - 1

  8. Вы не сможете.

  9. Он будет отображаться в списке ComboBox.Items, но вы не сможете назначить его индекс свойству SelectedIndex.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...