我也在DevExpress论坛上发布了这个,但你无法击败stackoverflow获得好的答案。
我似乎遇到了DevExpress AspxComboBox控件的问题。 我在Visual Studio 2008中使用DevExpress 9.1.11控件。
以下是我的控件:
<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>
我正在处理LinqDataSource的Selecting事件以过滤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对象,包含称为“Contacts”的LINQtoSQL对象的子集合。所有这一切都很完美。
当我尝试将新联系人添加到Entity的联系人集合,然后尝试更新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,导致上面的选择事件被触发并获取包含新联系人的更新列表。 一切都还好。我可以在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。
就好像它决定它是否是一个基于其自身项目列表之外的其他东西的有效索引。 我甚至尝试在列表中插入新的一个并使用已经存在的索引。一旦完成,该索引将不被接受。
我真的不明白。我很确定它一定是个bug。虽然这对我来说没有多大意义,因为它似乎已经被报道了大约一百万次的错误。所以我唯一的猜测是,它可能与我正在处理DataSource的Selecting事件并为其提供自定义结果这一事实有关。我不明白为什么那会很重要,但我看不出其他任何事情与众不同。
我一直在讨论这个问题已经有一段时间了,而且我已经没有想法了。所以任何帮助都将不胜感激。
谢谢, 托里
修改 我想也许我可以更加简洁地说出这个问题。
以下是它的内容:
根据LinqToSql对象将组合框绑定到LinqDataSource 与另一个LinqToSql对象相关联。
创建父对象的实例。
使用LinqDataSource.Selecting事件来使用。的内容 父对象实例的子对象集合,作为结果 LinistDataSource以IList(Of ChildObject)的形式。
显示ComboBox的内容。
将新的Child对象添加到父对象的子对象集合中 对象实例。
再次数据化ComboBox以获取新添加的内容 该系列的成员。
尝试将ComboBox的SelectedIndex设置为。的索引 新创建的成员,使用以下内容:
SignerComboBox.SelectedIndex = SignerComboBox.Items.Count - 1
你将无法做到。
它将显示在ComboBox.Items列表中,但您将无法使用 将它的索引分配给SelectedIndex属性。