在自定义控件内触发一个事件改变其他表单元素的值
因为考虑到自定义控件不能直接触发一个事件来与表单中其他元素进行交互,所以需要间接的来触发。
把一个事件定义为属性。
在自定义控件里添加如下脚本:
<script language="javascript" type="text/javascript">
function OnSelectedChanged() {
<%=this.OnChanged %>;
}
</script>
后台定义一个事件的属性:
/// <summary>
/// javascript事件
/// </summary>
public string OnChanged
{
get;
set;
}
在Page_Load里给自定义控件的组合控件的某一个或多个控件绑定脚本:
ddlDistrict.Attributes.Add("onchange", "javascript:OnSelectedChanged();");
在调用自定义控件的页面编写脚本调用后台触发自定义控件值改变时对于其他表单元素的赋值方法:
//选择区域后填充办公地址
function onSelectedChanged(){
$("#<%=this.btnShowWorkAddress.ClientID %>").click();
}
按钮,设置为隐藏,调用后台的一个方法:
<asp:Button ID="btnShowWorkAddress" runat="server" style="display:none;" OnClick="ShowWorkAddress" />
使用VS自带的ajax控件:
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
前台Page_Load里把隐藏按钮注册为ajax控件:
this.ScriptManager1.RegisterAsyncPostBackControl(btnShowWorkAddress);
前台的自定义控件指定上面自定义的方法OnChanged:
<uc1:Area ID="Area1" runat="server" OnChanged="onSelectedChanged()"></uc1:Area>
如果不希望触发自定义控件后页面刷新,可使用ajax控件把需要因自定义控件触发变动其值的控件包含在内,UpdateMode指定为Conditional:
<asp:UpdatePanel ID="upOffiAddr" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<webcontrol:UserTextBox ID="txtOffiAddr" FieldName="OfficeAddress" runat="server"
Width="160px" CanBeNull="False" RequiredFieldType="字符校验" onPropertyChange="GetAddressName();"></webcontrol:UserTextBox>
</ContentTemplate>
</asp:UpdatePanel>
最后是后台给控件赋值的方法:
protected void ShowWorkAddress(object sender, EventArgs e)
{
txtOffiAddr.Text = GetRegionName(int.Parse(Area1.AreaText), int.Parse(Area1.ProvinceText), int.Parse(Area1.CityText), int.Parse(Area1.DistrictidText));
//更新需要更新的控件区域
upOffiAddr.Update();
}
效果图:
选择行政区域的自定义控件后在其他表单元素控件中显示其值: