Telerik RadComboBox 多列下拉框第一项无法触发 SelectedIndexChanged 事件
原因:没有正确设置 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=’<%# … %>’的绑定实现)。