原因:没有正确设置 DataTextField.
分析:RadComboBox 控件的客户端 js 代码中,会判断选择的项和当前选项是否相等,如果不同,才会触发 SelectedIndexChanged 事件。
开始的时候不知道这个怪异的行为,仅仅设置了 DataValueField 字段。
但实际上单凭这个 telerik 的 js 代码还无法区分两个 item 是否相等。
所以,要“正确设置 DataTextField” 的准确含义实际上是说,要通过这样设置之后,绑定到数据源后产生的所有 item 的 Text 也互不相同。这样 RadComboBox 的客户端代码才能对他们进行区分。
这破控件的 bug 害我调试了好几个小时,到现在才找到根本原因。shit…
附最终调试通过的用模板实现的多列下拉框的前台代码:
<telerik:RadComboBox ID="cmbOptions" runat="server" Height="80px" Width="250px"
DropDownWidth="500px"
EmptyMessage='<%# GetSelectTip() %>'
HighlightTemplatedItems="true"
DataSource='<%# GetOptions(Eval("Id").ToString()) %>'
DataTextField="OptionText"
EnableTextSelection="false"
Skin="WebBlue"<telerik:RadComboBox ID="cmbOptions" runat="server" Height="80px" Width="250px"
DropDownWidth="500px"
EmptyMessage='<%# GetSelectTip() %>'
HighlightTemplatedItems="true"
DataSource='<%# GetOptions(Eval("Id").ToString()) %>'
DataTextField="OptionText"
EnableTextSelection="false"
Skin="WebBlue"
AutoPostBack="true"
DataValueField="Value"
SelectedValue='<%# GetSelectedValue(Eval("Id").ToString()) %>'
AppendDataBoundItems="false"
OnSelectedIndexChanged="cmbOptions_SelectedIndexChanged">
<HeaderTemplate>
<table style="width: 460px" cellspacing="0" cellpadding="0">
<tr>
<td style="width: 250px; white-space: normal; text-align: left;">Column 1</td>
<td style="width: 80px;">Column 2</td>
<td style="width: 50px; text-align: center;">Column 3</td>
<td style="width: 80px; text-align: right;">Column 4</td>
</tr>
</table>
</HeaderTemplate>
<ItemTemplate>
<table style="width: 460px;" cellspacing="0" cellpadding="0">
<tr>
<td style="width: 250px; white-space: normal; text-align: left;"><%#Eval("OptionText")%></td>
<td style="width: 80px; text-align: center;"><%# FormatNumber(Eval("Col2"), 2)%></td>
<td style="width: 50px; text-align: center;"><%#Eval("Col3")%></td>
<td style="width: 80px; text-align: right;"><%#Eval("Col4")%></td>
</tr>
</table>
</ItemTemplate>
</telerik:RadComboBox>
AutoPostBack="true"
DataValueField="Value"
SelectedValue='<%# GetSelectedValue(Eval("Id").ToString()) %>'
AppendDataBoundItems="false"
OnSelectedIndexChanged="cmbOptions_SelectedIndexChanged">
<HeaderTemplate>
<table style="width: 460px" cellspacing="0" cellpadding="0">
<tr>
<td style="width: 250px; white-space: normal; text-align: left;">Column 1</td>
<td style="width: 80px;">Column 2</td>
<td style="width: 50px; text-align: center;">Column 3</td>
<td style="width: 80px; text-align: right;">Column 4</td>
</tr>
</table>
</HeaderTemplate>
<ItemTemplate>
<table style="width: 460px;" cellspacing="0" cellpadding="0">
<tr>
<td style="width: 250px; white-space: normal; text-align: left;"><%#Eval("OptionText")%></td>
<td style="width: 80px; text-align: center;"><%# FormatNumber(Eval("Col2"), 2)%></td>
<td style="width: 50px; text-align: center;"><%#Eval("Col3")%></td>
<td style="width: 80px; text-align: right;"><%#Eval("Col4")%></td>
</tr>
</table>
</ItemTemplate>
</telerik:RadComboBox>
可以看到上面大量使用了绑定语法。后台只要 DataBind() 调用一下就全都自动填充了,包括当前选项也能记住 (通过 SelectedValue=’<%# … %>’的绑定实现)。