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=’<%# … %>’的绑定实现)。

posted on 2011-03-12 02:06  NeilChen  阅读(1772)  评论(0编辑  收藏  举报

导航