我动态生成TextBox可以实现,然后文本框内容改变时出现一个ListBox,是动态生成的,我想让ListBox选中的内容显示在TextBox中,可是这个selectedindexchange事件不执行,我同样的做法,为什么TextBox_TextChanged就可以执行啊.
后来我在TextBox_TextChange()
{
toList((TextBox)sender,columntext,sblb);
if(ViewState["id"]!=null)
{
ListBox lb=(ListBox)this.ViewState["id"];
lb.SelectedIndexChanged +=new EventHandler(lib_SelectedIndexChanged);
}}private void toList(TextBox tb,string columntext,string sblb)
{
if(ViewState["id"]==null)
{
ListBox lib=new ListBox();
lib.EnableViewState=true;
string sel0="select csnr from hnsb_dm02 where csmc='"+columntext+"' and sblb='"+sblb+"'";
SqlCommand cmd0=new SqlCommand(sel0,myConnection);
cmd0.Connection.Open();
SqlDataReader dr0=cmd0.ExecuteReader();
lib.Items.Add("");
while(dr0.Read())
{
lib.Items.Add(dr0["csnr"].ToString());
}
dr0.Close();
cmd0.Connection.Close();
string top=tb.Style["TOP"];
int top_l=int.Parse(top.Substring(0,top.Length-2))+20;
top=top_l+"px";
lib.Attributes.Add("style","Z-INDEX: 101;POSITION: absolute; left:"+tb.Style["LEFT"]+";top:"+top);
lib.AutoPostBack=true;
    ViewState["id"]=lib;
// lib.SelectedIndexChanged +=new EventHandler(lib_SelectedIndexChanged);
Panel1.Controls.Add(lib);
// Bind(lib,tb);
}
时,出现了如下错误:
类型“System.Web.UI.WebControls.ListBox”必须标记为 Serializable 或者具有 ReferenceConverter 以外的 TypeConverter,才能被放置在视图状态中。

解决方案 »

  1.   

    相同的代码,将它入在page_load()
    {
    if(!ISPOstback)
    {}
    ...
    ListBox lb1=new ListBox();
    lb1.Items.Add("aa");
    lb1.Items.Add("bb");
    lb1.AutoPostBack=true;
    lb1.SelectedIndexChanged +=new EventHandler(lb_SelectedIndexChanged);
    Panel1.Controls.Add(lb1);}
    这样就可以实现lb_selectedindexchanged,可是将放在动态生成的TextBox的textchanged中为什么不可以呢
      

  2.   

    asp.net控件不能放入 ViewState,它们都没有序列化(serialized)。如果你要放入ViewState,那么也只要放入数据就可以了,控件应该动态创建。在你把lb1放入Panel1之后,页面就输出给客户端了。当客户端修改了选项时,服务器端在重建页面的时候必须在Panel1中同样位置能够找到一个相同UniqueID标识的ListBox,这才能把客户端选择的结果传递给它,并且在随后触发事件。如果找不到(像你的程序在随后的Page_load结束之前可能都没有重建lb1),就不会触发。你可以用一个ViewState单元来标记此时页面上应该显示TextBox还是ListBox,以便在产生页面时动态产生正确的控件。然后才可能触发正确的事件。没有看懂你把控件放入ViewState是做什么用,如果就是做这个工作,那么只需要保存一个该产生哪类控件的标记(名称)就可以了,不用保存控件。
      

  3.   

    private void Page_Load(object sender, System.EventArgs e)
    {
    toControls(); 
    if(!IsPostBack)
    {
    }

    }
    private void toControls(string table)
    {
    for(int i=0;i<5;i++){
    Label lbb=new Label();
    lbb.Text=lb[i].ToString();
    lbb.EnableViewState=true;
    Panel1.Controls.Add(lbb);
    TextBox tbb=new TextBox();
    tbb.ID=tb[i].ToString();
    tbb.EnableViewState=true;
    tbb.AutoPostBack=true; tbb.TextChanged +=new EventHandler(tbb_TextChanged);
    Panel1.Controls.Add(tbb);
    }
    }
    private void tbb_TextChanged(object sender, System.EventArgs e)
    {
    toList((TextBox)sender,columntext,sblb);
    ListBox lb=(ListBox)Panel1.FindControl(ViewState["id"].ToString());
    lb.SelectedIndexChanged +=new EventHandler(lib_SelectedIndexChanged);

    }
    private void toList(TextBox tb,string columntext,string sblb)
    {
    ListBox lib=new ListBox();
    lib.EnableViewState=true;
    lib.ID=tb.ID+"lb";
    ...
    lib.Items.Add("");
    while(dr0.Read())
    {
    lib.Items.Add(dr0["csnr"].ToString());
    }
    dr0.Close();
    cmd0.Connection.Close();
    lib.AutoPostBack=true;
    ViewState["id"]=lib.ID ;
    lib.SelectedIndexChanged +=new EventHandler(lib_SelectedIndexChanged);
    Panel1.Controls.Add(lib);
    }
    private void lib_SelectedIndexChanged(object sender, System.EventArgs e)
    {
    Response.Write(((ListBox)sender).SelectedItem.Text);
    }
    帮我看一下问题出在哪里好吗
      

  4.   

    你必须在初始化页面或者Page_load里面重新生成ListBox,因为该控件(ListBox)的事件处理是在这两个事件之后,如果在调用事件处理函数之前没有生成ListBox,那么这个事件处理函数也就不会调用(控件都不存在)。