vs2005做的一个控件,控件内部html中用的是<asp:Table>控件,然后根据内部属性DataTable在page_load时来为Table动态产生行和列,每个列中都是textbox之类的控件(即可以做行编辑),
然后有个保存的按钮,在点保存的时候怎么在后台获得这些动态产生的行和列???请达人指点下
然后有个保存的按钮,在点保存的时候怎么在后台获得这些动态产生的行和列???请达人指点下
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
然后你把我的代码贴过去,肯定是你要的效果,但是有我说的那个毛病
就是说它的属性有没有保存到viewstate里面?
页面刷新后 table的结构就要从新组建 所以Table.Rows.Count肯定为0
但我把加载table 放在了if(!ispostback){}外面 可以解决这个问题可是既然是这样 在我上面代码上点了按钮保存 页面一回发 本身我加载的textbox控件 又变回原来的LiteralControl控件了
所以取不到textbox中修改的文本值,这点我以前弄了好几天都没有找到好的解决办法,后来还是放弃了
页面刷新后 table的结构就要从新组建 所以Table.Rows.Count肯定为0
但我把加载table 放在了if(!ispostback){}外面 可以解决这个问题可是既然是这样 在我上面代码上点了按钮保存 页面一回发 本身我加载的textbox控件 又变回原来的LiteralControl控件了
所以取不到textbox中修改的文本值,这点我以前弄了好几天都没有找到好的解决办法,后来还是放弃了
页面刷新后 table的结构就要从新组建 所以Table.Rows.Count肯定为0
但我把加载table 放在了if(!ispostback){}外面 可以解决这个问题可是既然是这样 在我上面代码上点了按钮保存 页面一回发 本身我加载的textbox控件 又变回原来的LiteralControl控件了
所以取不到textbox中修改的文本值,这点我以前弄了好几天都没有找到好的解决办法,后来还是放弃了
所以用js来动态创建,保存基本放弃了。
wyw1997:
enableviewstate已经为true了,但是没有找到autopostback属性
难道没有人做过这类的控件吗,达人你在哪里~~~~~~~
不清楚你的需求是什么样的,但我认为你最好选用datagrid或gridview来实现,这样给自己少点儿麻烦
而且每个单元格根据反射出DataTable字段的类型动态创建控件的,即DateTime类型折是专门的一个日期控件,
现在碰到问题是点击保存,页面刷新,Table内的对象被重建了,
有什么方法能在刷新时保留住Table内的所有对象???
而且每个单元格根据反射出DataTable字段的类型动态创建控件的,即DateTime类型折是专门的一个日期控件,
现在碰到问题是点击保存,页面刷新,Table内的对象被重建了,
有什么方法能在刷新时保留住Table内的所有对象???