一页面default.aspx,一search.ascx页面。
default.aspx点击按钮后调用search.ascx页。并把查询字符串(strsql)给search.ascx。
search.ascx里写了接收查询字符串的方法,根据查询字符串进行查询,并把结果绑定到gridview.
问题:
1。在default.aspx里动态增加了search.ascx,怎么把查询字符串传给search.ascx.
 Control aaa = LoadControl("search.ascx");
 this.PlaceHolder1.Controls.Add(aaa);
2.search.ascx里可不可以实现这样的功能:
一文本框,一查询按钮,一gridview.在文本框中输入内容,点查询按钮后,gridview里显示查询结果。可不可以还按普通的aspx页一样进行实现 ,如果不是如何实现呢?
我加了<form>出错,如果不加点查询按钮不回发 。
最好是有个例子

解决方案 »

  1.   

    回复你问题1.吧:Control aaa = LoadControl("search.ascx"); 
    this.PlaceHolder1.Controls.Add(aaa); 
    你的search的类型名或者接口 bbb=(你的search的类型名或者接口) aaa;
    bbb.SQL="select field1,field2 from yourTable";在你编译整个网站无语法错误之后,search.ascx的代码部分的class名就可以用来强制转换aaa为具体的类型对象,于是你就可以看到(在vs智能感知上也可以看到)那个用来输入SQL的属性。或者,更好的办法,是在开发search.ascx之前就可以定义一个interface,然后开发这个ascx时让其class实现此interface。此时,无需开发完成ascx,你就可以在开发aspx时直接使用这个interface强制转换aaa的类型,直接在vs智能感知上看到你需要的属性定义。基于接口开发软件是比较好的架构师所喜欢的做法,一般程序员不了解其好处所以会觉得稍显麻烦。
      

  2.   

    用户控件页:      //判断输入关键字是否为空
          if (this.txtContent.Value == "")
            {
                this.Page.RegisterClientScriptBlock("", "<script language='javascript'>alert('不能为空')</script>");
                return;
            }
            //不为空赋值
            _strContent = this.txtContent.Value;
            //将关键字加密(你也可以不加密)
            _strContent = RegisterService.GetUserNameByDES(_strContent);       //传递关键字参数
            Response.Redirect("/Knows/Search.aspx?keyword=" + _strContent, true);search.aspx页
    //接收关键字参数
     keyword = (Request.QueryString["keyword"] != null) ? Request.QueryString["keyword"].ToString() : 
    string.Empty;
    //再解密
      keyword1 = RegisterService.GetUserNameFromDES(keyword);
      

  3.   

    应该把用户控件通过IFRAME等添加到页面,在控件页面查询数据,通过session等传递。
      

  4.   

    wuyq11 不想用这种方式.
    我的search.ascx里
    public partial class ascx_search1 : System.Web.UI.UserControl{
       private string _kk, strsql;
        public string kk
        {
            get { return _kk; }
            set { this.strsql = _kk; }    }
        protected void Page_Load(object sender, EventArgs e)
        {            string connstr = "server=.;user id=sa;password=;database=pubs";
                SqlConnection conn = new SqlConnection(connstr);
                conn.Open();
                SqlDataAdapter da = new SqlDataAdapter(strsql, conn);
                DataTable DT = new DataTable();
                DataSet DS = new DataSet();
                da.Fill(DS, "jobs");
                GridView2.DataSource = DS.Tables[0].DefaultView;
                GridView2.DataBind();
                da.Dispose();  
         }
            
    }
    sp1234,你的search的类型名或者接口 bbb=(你的search的类型名或者接口) aaa; 
    应该是那个,我不太明白.
      

  5.   

    class名就是ascx_search1。你还可以设计一个interface,例如:public interface ISearch
    {
        string kk{get;set;}
    }然后,声明应该写:public partial class ascx_search1 : System.Web.UI.UserControl,ISearch

      private string _kk, strsql; 
        public string kk 
        { 
    .......
    最后,用户控件应该保持自己的状态,因此kk应该定义形如为:public string strsql
    {
      get{ return (string)ViewState["strsql"]; }
      set{ ViewState["strsql"]=value; strsql_changed=true; }
    }public bool strsql_changed=false;当你编写asp.net页面的时候,你可以首先在页面上放置一个Button,编写aspx并调试的时候时不时点击这个button测试一下你的页面上的控件时候丢掉了状态。你的程序,如果回发,由于变量strsql的值丢掉了,你的ascx就会显示错误的条件。所以strsql要记住自己的状态,使用ViewState,而不能简单使用变量。当页面上某个地方造成页面刷新的时候,strsql的值并没有改变,GridView2会自动恢复自己的状态以及界面。而你的ascx不论用户是否改变strsql的值都会重新读取数据库并重新生成GridView,这是极大的浪费。
      

  6.   

    你可以把你的Page_Load中的代码简单地放到Page_PreRender中,例如:    protected void Page_PreRender(object sender, EventArgs e) 
        { 
             if(strsql_changed)
             {
                string connstr = "server=.;user id=sa;password=;database=pubs"; 
                SqlConnection conn = new SqlConnection(connstr); 
                conn.Open(); 
                SqlDataAdapter da = new SqlDataAdapter(strsql, conn); 
                DataTable DT = new DataTable(); 
                DataSet DS = new DataSet(); 
                da.Fill(DS, "jobs"); 
                GridView2.DataSource = DS.Tables[0].DefaultView; 
                GridView2.DataBind(); 
                da.Dispose();  
            }
        } 
            
      

  7.   

    噢,当然,如果对外的接口中的属性名字叫做strsql,那么interface中就定义strsql 而不是定义kk。实际上你对外定义kk,对内使用strsql ,没有必要使用两个名字,完全可以内外一致起来。
      

  8.   

    我在default.aspx中的按钮里写代码:        Control aaa = LoadControl("ascx/search1.ascx");
            this.PlaceHolder1.Controls.Add(aaa);
            ascx_search1 bbb = (ascx_search1)aaa;
            bbb.kk = "select * from jobs";
    出现错误:The type or namespace name 'ascx_search1' could not be found (are you missing a using directive or an assembly reference?)
    在aspx页里还需要<%@regsist %>吗?
      

  9.   

    我知道还差什么了,看了下面这个知道错在哪了,贴出来供大家参考。特别感谢sp1234.
    (1)首先在ascx页
    <%@ Control ClassName="WebUserControl"  %>
    (2)其次aspx页
    <%@ Reference Control="WebUserControl.ascx" %>
    (3)最后cs
    protected WebUserControl aaa;
    如何:以编程方式创建 ASP.NET 用户控件的实例更新:2007 年 11 月就像能以编程方式在 ASP.NET 网页上创建任何服务器控件的实例一样,也能以同样方式创建用户控件的实例。
    以编程方式创建用户控件的实例   1.      在用户控件中,请确保 @ Control 指令包含将类分配给用户控件的 ClassName 属性。      下面的示例对 ClassName 属性进行设置以强类型化用户控件。
          复制代码      <%@ Control className="MyUserControl" %>   2.      在要使用该用户控件的页中,通过 @ Reference 指令创建对该用户控件的引用。      当以编程方式创建用户控件时,只有创建了对该控件的引用之后,ASP.NET 网页才能使用该用户控件的强类型。例如,下面的代码创建对 MyUserControl.ascx 文件中所创建用户控件的引用。
          复制代码      <%@ Reference Control="MyUserControl.ascx" %>      [说明] 说明:      打算以编程方式加载控件时,请使用 @ Reference。打算以声明方式向页添加用户控件时,请使用 @ Register 指令。有关详细信息,请参见如何:在 ASP.NET 网页中包括用户控件。
       3.      使用用户控件的类名创建该控件的实例变量。该类将成为 ASP 命名空间的一部分。      例如,如果希望创建声明为 Spinner 类的用户控件的实例,请使用如下所示的语法:
          Visual Basic
          复制代码      Protected Spinner1 As ASP.Spinner      C#
          复制代码      Protected ASP.Spinner Spinner1;   4.      通过在代码中调用 LoadControl 方法创建用户控件的实例。
       5.      根据需要分配属性值,然后向页上容器的 ControlCollection 集合添加控件,如 PlaceHolder 控件。
          [说明] 说明:      当使用 Add 方法向 ControlCollection 对象添加控件时,这些控件将按被处理的顺序放置在集合中。如果希望将控件添加到集合中的特定位置,请使用 AddAt 方法并指定要在其中存储该控件的索引位置。 示例下面的示例演示一个以编程方式加载用户控件的 ASP.NET 网页。该页包含一个 @ Reference 指令,用于指定控件的文件。LoadControl 方法读取该文件并将其实例化为可添加到页的控件。C#
    复制代码<%@ Page Language="C#" %>
    <%@ Reference Control="~/Controls/Spinner.ascx" %>
    <script runat="server">
    private ASP.Spinner Spinner1;
    protected void Page_Load(object sender, EventArgs e)
    {
        Spinner1 = (ASP.Spinner)LoadControl("~/Controls/Spinner.ascx");
         // Set MaxValue first.
        Spinner1.MaxValue = 20;
        Spinner1.MinValue = 10;
        PlaceHolder1.Controls.Add(Spinner1);
    }protected void Button1_Click(object sender, EventArgs e)
    {
        Label1.Text = Spinner1.CurrentNumber.ToString();
    }
    </script><html>
    <head id="Head1" runat="server">
      <title>Load User Control Programmatically</title>
    </head>
    <body>
      <form id="form1" runat="server">
        <div>
          <asp:PlaceHolder runat=server ID="PlaceHolder1" />
          <br />
          <asp:Button ID="Button1" runat="server" 
            Text="Button" 
            OnClick="Button1_Click" />
          <br />
          <br />
          <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
        </div>
      </form>
    </body>
    </html>