我做了一个用户控件,默认显示一个LinkButton,点击后弹出ModalPopupExtender的Panel,Panel中有一个Button,和DropDownList,用户从DropDownList中选择记录后,点击Button,将选中记录的名称赋值到LinkButton的Text属性。
控件放在页面中使用没有问题,放在TabContainer中使用,可以正常弹出Panel,但似乎无法触发Button的Click事件。哪位兄弟做过类似的应用,帮忙看一下,谢谢了!

解决方案 »

  1.   

    以下是用户控件的代码:
    <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="SelectCeKongSheBei.ascx.cs"
      Inherits="AtonDatabaseG2.UserControl.SelectCeKongSheBei" %>
    <%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>
    <%@ Register Src="PictureDisplay.ascx" TagName="PictureDisplay" TagPrefix="uc2" %>
    <asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="server">
    </asp:ScriptManagerProxy>
    <asp:LinkButton ID="lnkbtnSelect" runat="server">选择</asp:LinkButton>
    <cc1:ModalPopupExtender ID="lnkbtnSelect_ModalPopupExtender" runat="server" PopupControlID="pnl"
      OkControlID="btn" CancelControlID="btnCancel" TargetControlID="lnkbtnSelect">
    </cc1:ModalPopupExtender>
    <asp:Panel ID="pnl" runat="server" CssClass="popupPanel" Style="width: 650px; display: none">
      <br />
      &nbsp;&nbsp;&nbsp;&nbsp;请选择测控设备:<asp:DropDownList ID="ddl" runat="server" AutoPostBack="True"
        OnSelectedIndexChanged="ddl_SelectedIndexChanged">
      </asp:DropDownList>
      <br />
      <br />
      <center>
        <asp:UpdatePanel ID="upDengLong" runat="server">
          <ContentTemplate>
          <table cellpadding="2" cellspacing="0" style="width: 600px" class="inputTable">
            <tr>
              <td class="leftCell" style="width: 80px">
                设备型号
              </td>
              <td class="rightCell" style="width: 100px">
                &nbsp;<asp:Label ID="lblCeKongSheBeiXingHao" runat="server"></asp:Label>
              </td>
              <td class="leftCell" style="width: 80px">
                生产厂家
              </td>
              <td class="rightCell" colspan="3">
                &nbsp;<asp:Label ID="lblCeKongSheBeiChangJia" runat="server"></asp:Label>
              </td>
            </tr>
            <tr>
              <td class="leftCell" style="width: 80px">
                工作电压
              </td>
              <td class="rightCell" style="width: 100px">
                &nbsp;<asp:Label ID="lblGongZuoDianYa" runat="server"></asp:Label>&nbsp;V
              </td>
              <td class="leftCell" style="width: 80px">
                工作电流
              </td>
              <td class="rightCell" style="width: 100px">
                &nbsp;<asp:Label ID="lblGongZuoDianLiu" runat="server"></asp:Label>&nbsp;A
              </td>
              <td class="leftCell" style="width: 80px">
                工作功耗
              </td>
              <td class="rightCell" style="width: 100px">
                &nbsp;<asp:Label ID="lblGongZuoGongHao" runat="server"></asp:Label>&nbsp;W
              </td>
            </tr>
            <tr>
              <td class="leftCell" style="width: 80px">
                有效范围
              </td>
              <td class="rightCell" style="width: 100px">
                &nbsp;<asp:Label ID="lblYouXiaoFanWei" runat="server"></asp:Label>&nbsp;海里
              </td>
              <td class="leftCell" style="width: 80px">
                安装尺寸
              </td>
              <td class="rightCell" colspan="3">
                &nbsp;<asp:Label ID="lblAnZhuangChiCun" runat="server"></asp:Label>&nbsp;(mm×mm×mm)
              </td>
            </tr>
            <tr>
              <td class="leftCell" style="width: 80px">
                通讯方式
              </td>
              <td class="rightCell" style="width: 100px">
                &nbsp;<asp:Label ID="lblTongXunFangShi" runat="server"></asp:Label>
              </td>
              <td class="leftCell" style="width: 80px">
                设备价值
              </td>
              <td class="rightCell" style="width: 100px">
                &nbsp;<asp:Label ID="lblCeKongSheBeiJiaZhi" runat="server"></asp:Label>&nbsp;元
              </td>
              <td class="leftCell" style="width: 80px">
              </td>
              <td class="rightCell" style="width: 100px">
              </td>
            </tr>
            <tr>
              <td class="leftCell" style="width: 80px">
                设备照片
              </td>
              <td class="rightCell" colspan="5">
                <uc2:PictureDisplay ID="PictureDisplay1" runat="server" />
              </td>
            </tr>
          </table>
          </ContentTemplate>
          <Triggers>
            <asp:AsyncPostBackTrigger ControlID="ddl" EventName="SelectedIndexChanged" />
          </Triggers>
        </asp:UpdatePanel>
        <br />
        <asp:Button ID="btn" runat="server" Text="Button" Style="display: none" />
        <asp:Button ID="btnSave" runat="server" Text="确定" OnClick="btnSave_Click" />
        &nbsp;&nbsp;
        <asp:Button ID="btnCancel" runat="server" Text="取消" />
        <br />
        <br />
      </center>
    </asp:Panel>using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Data;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Linq;
    using Microsoft.Practices.EnterpriseLibrary.Data;
    using AtoNBusinessLogic.Common;
    using AtoNBusinessLogic.QiCai;
    using Reform.Common;namespace AtonDatabaseG2.UserControl
    {
        public partial class SelectCeKongSheBei : System.Web.UI.UserControl
        {
            Database db = DatabaseFactory.CreateDatabase("AtoN");
            /// <summary>
            /// 器材选择事件
            /// </summary>
            public event QiCaiSelectedChanged OnSelectedChanged;
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    BindDropDownList();
                    ScriptManager sm = ScriptManager.GetCurrent(Page);
                    sm.RegisterPostBackControl(btnSave);
                }
            }        /// <summary>
            /// 绑定测控设备控件信息
            /// </summary>
            /// <param name="id">测控设备ID</param>
            public void BindByID(string id)
            {
                CeKongSheBeiDataAccess da = new CeKongSheBeiDataAccess(db);
                CeKongSheBeiData data = da.SelectByID(id);
                lnkbtnSelect.Text = data.CeKongSheBeiXingHao;
                lnkbtnSelect.ToolTip = data.ID.ToString();
                BindCeKongSheBeiInfo(id);
                ddl.SelectedValue = id;
            }        private void BindDropDownList()
            {
                CeKongSheBeiDataAccess da = new CeKongSheBeiDataAccess(db);
                List<CeKongSheBeiData> list = da.SelectAll();
                ddl.Items.Add(new ListItem(string.Empty, "-1"));
                foreach (CeKongSheBeiData data in list)
                {
                    ddl.Items.Add(new ListItem(data.CeKongSheBeiXingHao, data.ID.ToString()));
                }
            }        protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
            {
                if (ddl.SelectedItem != null)
                {
                    BindCeKongSheBeiInfo(ddl.SelectedValue);
                }
            }        private void ResetCeKongSheBeiInfo()
            {
                lblCeKongSheBeiChangJia.Text = string.Empty;
                lblCeKongSheBeiXingHao.Text = string.Empty;
                lblGongZuoDianYa.Text = string.Empty;
                lblGongZuoDianLiu.Text = string.Empty;
                lblGongZuoGongHao.Text = string.Empty;
                lblYouXiaoFanWei.Text = string.Empty;
                lblAnZhuangChiCun.Text = string.Empty;
                lblTongXunFangShi.Text = string.Empty;
                lblCeKongSheBeiJiaZhi.Text = string.Empty;
                PictureDisplay1.BindByPictureID("-1");
            }
            
            private void BindCeKongSheBeiInfo(string id)
            {
                if (string.IsNullOrEmpty(id))
                {
                    ResetCeKongSheBeiInfo();
                    return;
                }
                CeKongSheBeiDataAccess da = new CeKongSheBeiDataAccess(db);
                CeKongSheBeiData data = da.SelectByID(id);
                if (data == null)
                {
                    ResetCeKongSheBeiInfo();
                    return;
                }
                lblCeKongSheBeiChangJia.Text = data.CeKongSheBeiChangJia;
                lblCeKongSheBeiXingHao.Text = data.CeKongSheBeiXingHao;
                if (data.GongZuoDianYa != 0)
                {
                    lblGongZuoDianYa.Text = data.GongZuoDianYa.ToString();
                }
                if (data.GongZuoDianLiu != 0)
                {
                    lblGongZuoDianLiu.Text = data.GongZuoDianLiu.ToString();
                }
                if (data.GongZuoGongHao != 0)
                {
                    lblGongZuoGongHao.Text = data.GongZuoGongHao.ToString();
                }
                if (data.YouXiaoFanWei != 0)
                {
                    lblYouXiaoFanWei.Text = data.YouXiaoFanWei.ToString();
                }
                lblAnZhuangChiCun.Text = data.AnZhuangChiCun;
                lblTongXunFangShi.Text = data.TongXunFangShi;
                if (data.CeKongSheBeiJiaZhi != 0)
                {
                    lblCeKongSheBeiJiaZhi.Text = data.CeKongSheBeiJiaZhi.ToString();
                }
                PictureDisplay1.BindByPictureID(data.PhotoID.ToString());
            }        protected void btnSave_Click(object sender, EventArgs e)
            {
                if (ddl.SelectedValue != string.Empty && ddl.SelectedValue != "-1")
                {
                    lnkbtnSelect.ToolTip = ddl.SelectedValue;
                    CeKongSheBeiDataAccess da = new CeKongSheBeiDataAccess(db);
                    CeKongSheBeiData data = da.SelectByID(ddl.SelectedValue);
                    lnkbtnSelect.Text = data.CeKongSheBeiXingHao;
                    QiCaiEventArg arg = new QiCaiEventArg(data.ID);
                    if (OnSelectedChanged != null)
                    {
                        OnSelectedChanged(this, arg);
                    }
                }
                else
                {
                    lnkbtnSelect.Text = "选择";
                    lnkbtnSelect.ToolTip = "-1";
                }
                lnkbtnSelect_ModalPopupExtender.Hide();
            }
        }
    }
      

  2.   

    订阅用户控件事件的代码如下:protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                //其他代码略
                SelectDingBiao1.OnSelectedChanged += new AtonDatabaseG2.UserControl.QiCaiSelectedChanged(SelectDingBiao1_OnSelectedChanged);
            }
    void SelectDingBiao1_OnSelectedChanged(object sender, AtonDatabaseG2.UserControl.QiCaiEventArg e)
            {
                DingBiaoDataAccess dingbiaoDA = new DingBiaoDataAccess(db);
                DingBiaoData dingbiao = dingbiaoDA.SelectByID(e.QiCaiID.ToString());
                if (dingbiao != null)
                {
                    lblDingBiaoXingZhuang.Text = dingbiao.DingBiaoXingZhuang;
                    lblDingBiaoYanSe.Text = dingbiao.DingBiaoYanSe;
                    lblDingBiaoTuAn.Text = dingbiao.DingBiaoTuAn;
                }
            }
      

  3.   

    Re:控件放在页面中使用没有问题,放在TabContainer中使用,可以正常弹出Panel,但似乎无法触发Button的Click事件。 我想问一下,如果你这些代码不做成控件,直接应用在页面的TabContainer中,会有问题吗?因为首先要排除掉控件的问题,
    另外我建议你将没用的代码删除掉,提取一个测试版本,这样代码会少一些,帮你找问题的人就会多一些.
      

  4.   

    ModalPopupExtender
      

  5.   

    本想帮帮你,可是我将控件放在 TabContainer 标记中就会报错:TabContainer cannot have children of type 'ASP.controltest_ascx'. 
    请问你是怎样将控件放在 TabContainer 中的?另外,估计如果你把选择事件写成客户端代码,即写成js应该就没有问题了,部分代码如下:将 
    <asp:Button ID="btnSave" runat="server" Text="确定" OnClick="btnSave_Click" />
    改成库户端Input
    <input type="button" value="确定" onclick="test();" />
    function test()
            {
                var obj=document.getElementById("<%=ddl.ClientID %>");
                var str=obj.options[obj.selectedIndex].text;
                document.getElementById("<%=lnkbtnSelect.ClientID%>").childNodes[0].nodeValue=str;
            }
      

  6.   

    已解决,你的代码太多,我用的我自己的测试代码,楼主可以用我的控件代码试一试.
    说明:
    1.因TabContainer中用到了 ScriptManager,所以我的控件中没有加 ScriptManager
    2.控件中用到的 StyleSheet.css,你安装完toolkit后自己的机器中能找到,放到同一目录下即可.
    3.我的代码测试无任何问题,你的如果还是不行就找找别的原因.
    控件代码如下:
    ControlTest.ascx
    <%@ Control Language="C#" AutoEventWireup="true" %>
    <%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %><script runat="server">    protected void Button3_Click(object sender, EventArgs e)
        {
            this.LinkButton1.Text = this.DropDownList1.SelectedItem.Text;
        }
    </script><link href="StyleSheet.css" rel="stylesheet" type="text/css" />
        &nbsp; &nbsp;&nbsp;
            <asp:LinkButton ID="LinkButton1" runat="server">Login</asp:LinkButton>
            <asp:Panel ID="Panel1" runat="server" Height="129px" Width="250px" Style="display: none" CssClass="modalPopup">
                &nbsp; &nbsp;
            <table width="100%" style="height:100%; width: 100%;" id="TABLE1">
                <tr>
                    <td style="width: 38px; height: 24px;">
                        测试</td>
                    <td style="text-align: left; height: 24px;">
                        &nbsp;
                        <asp:DropDownList ID="DropDownList1" runat="server">
                            <asp:ListItem Selected="True" Value="a">aaa</asp:ListItem>
                            <asp:ListItem Value="b">bbb</asp:ListItem>
                            <asp:ListItem Value="c">ccc</asp:ListItem>
                            <asp:ListItem Value="d">ddd</asp:ListItem>
                        </asp:DropDownList>
                        <asp:Button ID="Button3" runat="server" Text="test" OnClick="Button3_Click" />
                    </td>    
                    <td style="width: 3px; height: 24px;"></td>
                </tr>
                </table>
                <asp:Button ID="Button1" runat="server" Text="Button" />
                <asp:Button ID="Button2" runat="server" Text="Cancle" />
            </asp:Panel>
            &nbsp;
            <br />
            <cc1:ModalPopupExtender ID="ModalPopupExtender1" runat="server" 
                TargetControlID="LinkButton1"
                PopupControlID="Panel1"
                BackgroundCssClass="modalBackground" 
                OkControlID="Button1" 
                CancelControlID="Button2"
                DropShadow="true">
            </cc1:ModalPopupExtender>
    放置控件的测试页代码如下:
    FormTest.aspx
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="FormTest.aspx.cs" Inherits="FormTest" %>
    <%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>
    <%@ Register Src="ControlTest.ascx" TagName="ControlTest" TagPrefix="uc1" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>无标题页</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
        <script type="text/javascript">
            function PanelClick(sender, e) {
                var Messages = $get('<%=Messages.ClientID%>');
                Highlight(Messages);
            }        function ActiveTabChanged(sender, e) {
                var CurrentTab = $get('<%=CurrentTab.ClientID%>');
                CurrentTab.innerHTML = sender.get_activeTab().get_headerText();
                Highlight(CurrentTab);
            }        var HighlightAnimations = {};
            function Highlight(el) {
                if (HighlightAnimations[el.uniqueID] == null) {
                    HighlightAnimations[el.uniqueID] = AjaxControlToolkit.Animation.createAnimation({
                        AnimationName : "color",
                        duration : 0.5,
                        property : "style",
                        propertyKey : "backgroundColor",
                        startValue : "#FFFF90",
                        endValue : "#FFFFFF"
                    }, el);
                }
                HighlightAnimations[el.uniqueID].stop();
                HighlightAnimations[el.uniqueID].play();
            }
            
            function ToggleHidden(value) {
                $find('<%=TabContainer1.ClientID%>').get_tabs()[2].set_enabled(value);
            }
        </script>
        <cc1:TabContainer ID="TabContainer1" runat="server" Height="150px">
            <cc1:TabPanel runat="Server" ID="Panel1" HeaderText="Signature and Bio">
                    <ContentTemplate>
                        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
                            <ContentTemplate>
                                <table>
                                    <tr>
                                        <td>Signature:</td>
                                        <td><asp:TextBox ID="signatureText" runat="server" /></td>
                                    </tr>
                                    <tr>
                                        <td>Bio:</td>
                                        <td><asp:TextBox ID="bioText" runat="server" /></td>
                                    </tr>
                                </table>
                                <asp:Button ID="Button3" runat="Server" Text="Save" />
                                <br /><br />
                                Hit Save to cause a postback from an update panel inside the tab panel.<br />
                            </ContentTemplate>
                        </asp:UpdatePanel>
                    </ContentTemplate>
                </cc1:TabPanel>
                
                <cc1:TabPanel runat="Server" ID="Panel3" HeaderText="Email" >
                    <ContentTemplate>
                        Email: <asp:TextBox ID="emailText" runat="server" />
                        <br /><br />
                        <asp:Button ID="Button1" runat="Server" Text="Save" />
                        <br /><br />
                        Hit Save to cause a full postback.
                    </ContentTemplate>
                </cc1:TabPanel>
            
                <cc1:TabPanel runat="Server" ID="Panel2"  HeaderText="Controls">
                    <ContentTemplate>
                        <div>Controls authored by Toolkit User (read-only - demo purposes):</div>
                        <ul>
                            <li>Calendar</li>
                            <li>MaskedEdit</li>
                            <li>Accordion</li>
                            <li>Calendar</li>
                            <li>Calendar</li>
                            <uc1:ControlTest ID="ControlTest1" runat="server" />
                        </ul>
                        <br />
                    </ContentTemplate>
                </cc1:TabPanel>
        </cc1:TabContainer>
        
        <asp:Label ID="Messages" runat="server"></asp:Label>
        <asp:Label ID="CurrentTab" runat="server"></asp:Label>
        
        </form>
    </body>
    </html>