vs2005做的一个控件,控件内部html中用的是<asp:Table>控件,然后根据内部属性DataTable在page_load时来为Table动态产生行和列,每个列中都是textbox之类的控件(即可以做行编辑),
然后有个保存的按钮,在点保存的时候怎么在后台获得这些动态产生的行和列???请达人指点下

解决方案 »

  1.   

    我做过你要的这个效果,前面的需求都能完成,但在最后有一个弱点,因为在页面刷新时,web的table控件会从新组建自己的结构,也就是所说以前的所有信息都会不能保存,这样会对你点击更新时,从每个textbox中取值有问题,好了,废话不说了,我把我的例子给你贴出来,你自己看吧,库是模仿pubs库中的authors表建的:
    SQL:
    -------------------------------------------------
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[authors]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[authors]
    GOCREATE TABLE [dbo].[authors] (
    [au_id] [int] IDENTITY (1, 1) NOT NULL ,
    [au_lname] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [au_fname] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [phone] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [address] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [city] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [state] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [zip] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [cont] [bit] NULL ,
    [delstate] [int] NULL 
    ) ON [PRIMARY]
    GO
    HTML:
    -----------------------------------------------------
    ...
    <head runat="server">
        <title>无标题页</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:Table ID="Table1" runat="server" GridLines="Both" Style="position: relative">
            </asp:Table>
        </div>
        </form>
    </body>
    ...
    C#:
    --------------------------------------------------
    SqlConnection con;
        SqlCommand com;
        SqlDataAdapter da;
        DataTable dt;    protected void Page_Load(object sender, EventArgs e)
        {
            Page.SmartNavigation = true;
            BindTalbe();
        }    public void conString()
        {
            con = new SqlConnection("server=.;uid=sa;pwd=;database=Demo");
        }    public DataTable GetData(string sql)
        {
            conString();
            da = new SqlDataAdapter(sql,con);
            dt = new DataTable();
            da.Fill(dt);
            return dt;
        }    #region//绑定Table
        public void BindTalbe()
        {
            Table1.Width = 1000;
            int xy = 1;
            int xx = 1;
            DataTable dt = GetData("select au_id,au_lname,au_fname,phone,address,city,state,zip from authors");
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                TableRow tr = new TableRow();
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    TableCell td = new TableCell();
                    td.Controls.Add(new LiteralControl(dt.Rows[i][j].ToString()));
                    tr.Cells.Add(td);
                }
                TableCell tdUpdate = new TableCell();
                Button upBtn = new Button();
                upBtn.ID = "Button" + xy.ToString();
                upBtn.Text = "编辑";
                upBtn.Click += new EventHandler(upBtn_Click);            Button editBtn = new Button();
                editBtn.ID = "EButton" + xx.ToString();
                editBtn.Text = "更新";
                editBtn.Visible = false;
                editBtn.Click += new EventHandler(editBtn_Click);            tdUpdate.Controls.Add(upBtn);
                tdUpdate.Controls.Add(editBtn);
                tr.Cells.AddAt(dt.Columns.Count, tdUpdate);
                Table1.Rows.Add(tr);
                xy++;//ID编号+1
                xx++;
            }
        }
        #endregion    //更新按钮事件
        void editBtn_Click(object sender, EventArgs e)
        {
            Button btn = (Button)sender;
            string BtnID = btn.ID;
            int rowIndex = 0;        //更新当前行记录
            string uid = "", lname = "", fname = "", phone = "", address = "", city = "", state = "", zip = "";        for (int i = 0; i < Table1.Rows.Count; i++)
            {
                string id = Table1.Rows[i].Cells[8].Controls[1].ID;
                if (id == BtnID)//把每行按钮的ID都取出来和触发行按钮ID进行比较
                {
                    rowIndex = i;//得到当前更新行索引
                    Session["index"] = rowIndex;
                    uid = ((TextBox)Table1.Rows[rowIndex].Cells[0].Controls[0]).Text;
                    lname = ((TextBox)Table1.Rows[rowIndex].Cells[1].Controls[0]).Text;
                    fname = ((TextBox)Table1.Rows[rowIndex].Cells[2].Controls[0]).Text;
                    phone = ((TextBox)Table1.Rows[rowIndex].Cells[3].Controls[0]).Text;
                    address = ((TextBox)Table1.Rows[rowIndex].Cells[4].Controls[0]).Text;
                    city = ((TextBox)Table1.Rows[rowIndex].Cells[5].Controls[0]).Text;
                    state = ((TextBox)Table1.Rows[rowIndex].Cells[6].Controls[0]).Text;
                    zip = ((TextBox)Table1.Rows[rowIndex].Cells[7].Controls[0]).Text;                btn.Visible = false;
                    Table1.Rows[i].Cells[8].Controls[0].Visible = true;
                }
            }        conString();
            string sql = "update authors set au_lname=@lname,au_fname=@fname,phone=@phone,address=@address,city=@city,state=@state,zip=@zip where au_id=@uid";
            com = new SqlCommand(sql,con);
            com.Parameters.Add("@lname",System.Data.SqlDbType.VarChar,50);
            com.Parameters.Add("@fname", System.Data.SqlDbType.VarChar, 50);
            com.Parameters.Add("@phone", System.Data.SqlDbType.VarChar, 50);
            com.Parameters.Add("@address", System.Data.SqlDbType.VarChar, 50);
            com.Parameters.Add("@city", System.Data.SqlDbType.VarChar, 50);
            com.Parameters.Add("@state", System.Data.SqlDbType.VarChar, 50);
            com.Parameters.Add("@zip", System.Data.SqlDbType.VarChar, 50);
            com.Parameters.Add("@uid", System.Data.SqlDbType.Int,4);        com.Parameters["@lname"].Value = lname;
            com.Parameters["@lname"].Value = fname;
            com.Parameters["@lname"].Value = phone;
            com.Parameters["@lname"].Value = address;
            com.Parameters["@lname"].Value = city;
            com.Parameters["@lname"].Value = state;
            com.Parameters["@lname"].Value = zip;
            com.Parameters["@lname"].Value = Convert.ToInt32(uid);        try
            {
                con.Open();
                com.ExecuteNonQuery();
                con.Close();
            }
            catch (Exception ex)
            { }
        }    #region//编辑按钮事件
        void upBtn_Click(object sender, EventArgs e)
        {
            //找到触发事件的Button的行索引
            Button btn = (Button)sender;
            string BtnID = btn.ID;
            int rowIndex = 0;        for (int i = 0; i < Table1.Rows.Count; i++)
            {
                string id = Table1.Rows[i].Cells[8].Controls[0].ID;
                //如果当前行被触发,则显示更新按钮,但又点击下一行的编辑按钮,则先把上面的更新按钮变成编辑,再把下面除法的按钮变成更新
                //*****************************************************
                Table1.Rows[i].Cells[8].Controls[0].Visible = true;
                Table1.Rows[i].Cells[8].Controls[1].Visible = false;
                //*****************************************************
                if (id == BtnID)//把每行按钮的ID都取出来和触发行按钮ID进行比较
                {
                    rowIndex = i;//得到当前更新行索引
                    btn.Visible = false;
                    Table1.Rows[i].Cells[8].Controls[1].Visible = true;
                }
            }        for (int i = 0; i < Table1.Rows[rowIndex].Cells.Count - 1; i++)//因为最后一行是Button按钮,所以要少一列
            {
                //取得td中LiteralControl控件的ID
                string id = ((LiteralControl)Table1.Rows[rowIndex].Cells[i].Controls[0]).UniqueID;
                //得到LiteralControl中的的文本值
                string txtVale = ((LiteralControl)Table1.Rows[rowIndex].Cells[i].FindControl(id)).Text;
                Table1.Rows[rowIndex].Controls[i].Controls.Remove(Table1.Rows[rowIndex].Cells[i].Controls[0]);
                TextBox tb = new TextBox();
                tb.Text = txtVale;
                tb.Width = 100;
                Table1.Rows[rowIndex].Cells[i].Controls.Add(tb);
            }
        }
        #endregion
      

  2.   

    数据你自己填吧,可以直接从pubs库的那个表复制过来
    然后你把我的代码贴过去,肯定是你要的效果,但是有我说的那个毛病
      

  3.   

    首先你要打开MDSN帮助,查找Table这个类,看看他下面有没有关于rows[i].cells[j].text的属性
      

  4.   

    你跟我的意思差不多,我是想在点保存的时候遍历Table内所有的行和列放到一个DataTable中,然后再返回给另外一个调用它控件,但一点保存,Table.Rows.Count就为0了,根本就取不到啊。
      

  5.   

    你查看Table控件的enableviewstate是不是为true
    就是说它的属性有没有保存到viewstate里面?
      

  6.   

    这个最好还是用javascript来做,控制起来方便而且新增什么的不用刷新,我开始也是使用这个table后来放弃了。
      

  7.   

    对吧 我已经在上面说过了
    页面刷新后 table的结构就要从新组建  所以Table.Rows.Count肯定为0
    但我把加载table 放在了if(!ispostback){}外面 可以解决这个问题可是既然是这样 在我上面代码上点了按钮保存 页面一回发  本身我加载的textbox控件 又变回原来的LiteralControl控件了
    所以取不到textbox中修改的文本值,这点我以前弄了好几天都没有找到好的解决办法,后来还是放弃了
      

  8.   

    对吧 我已经在上面说过了
    页面刷新后 table的结构就要从新组建  所以Table.Rows.Count肯定为0
    但我把加载table 放在了if(!ispostback){}外面 可以解决这个问题可是既然是这样 在我上面代码上点了按钮保存 页面一回发  本身我加载的textbox控件 又变回原来的LiteralControl控件了
    所以取不到textbox中修改的文本值,这点我以前弄了好几天都没有找到好的解决办法,后来还是放弃了
      

  9.   

    对吧 我已经在上面说过了
    页面刷新后 table的结构就要从新组建  所以Table.Rows.Count肯定为0
    但我把加载table 放在了if(!ispostback){}外面 可以解决这个问题可是既然是这样 在我上面代码上点了按钮保存 页面一回发  本身我加载的textbox控件 又变回原来的LiteralControl控件了
    所以取不到textbox中修改的文本值,这点我以前弄了好几天都没有找到好的解决办法,后来还是放弃了
      

  10.   

    zwwlovezy1我的做法是跟你一样的,但是我cell中的控件更加复杂,必须要在后台绑定一个BusinessView才能取得数据,
    所以用js来动态创建,保存基本放弃了。
    wyw1997:
    enableviewstate已经为true了,但是没有找到autopostback属性
    难道没有人做过这类的控件吗,达人你在哪里~~~~~~~
      

  11.   

    那为什么就不用GridView的模板列去实现呢?同样都是web控件,为什么非要追求难度呢?
    不清楚你的需求是什么样的,但我认为你最好选用datagrid或gridview来实现,这样给自己少点儿麻烦
      

  12.   

    我要做的是能根据DataTable动态创建行和列的控件,
    而且每个单元格根据反射出DataTable字段的类型动态创建控件的,即DateTime类型折是专门的一个日期控件,
    现在碰到问题是点击保存,页面刷新,Table内的对象被重建了,
    有什么方法能在刷新时保留住Table内的所有对象???
      

  13.   

    我要做的是能根据DataTable动态创建行和列的控件,
    而且每个单元格根据反射出DataTable字段的类型动态创建控件的,即DateTime类型折是专门的一个日期控件,
    现在碰到问题是点击保存,页面刷新,Table内的对象被重建了,
    有什么方法能在刷新时保留住Table内的所有对象???