[请高手指导]我做了一个自定义的DATAGRID控件,目的无非是将增删改功能集成到其中,但按删除时根本不起作用,按增加记录时给我无端的加了

windowszhm 2005-05-08 11:15:49
我做了一个自定义的DATAGRID控件,目的无非是将增删改功能集成到其中,但按删除时根本不起作用(而且有出错),按增加记录时给我无端的加了一个空行,请帮忙看一下该程序!
谢谢!


using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Reflection;
using System.Xml;

namespace HBDataGrid
{
/// <summary>
/// WebDataGrid 的摘要说明。
/// </summary>
[DefaultProperty("ConnectionString"),
ToolboxData("<{0}:WebDataGrid runat=server></{0}:WebDataGrid>")]
public class WebDataGrid : System.Web.UI.WebControls.DataGrid
{
private string connectionstring;
private string sqlstring;
private string tablename;
private bool shouldRebind = false;
private DataTable dt = null;
private DataSet ds = null;
private SqlDataAdapter myDataAdapter=null;
private SqlCommandBuilder objAutoGen = null;

// 连接字符串属性
[Bindable(true),
Category("数据"),
DefaultValue("")]
public string ConnectionString
{
get
{
return connectionstring;
}

set
{
connectionstring = value;
}
}

// 数据表名
[Bindable(true),
Category("数据"),
DefaultValue("")]
public string TableName
{
get
{
return tablename;
}

set
{
tablename = value;
}
}

// SQL语句
[Bindable(true),
Category("数据"),
DefaultValue("")]
public string SqlString
{
get
{
return sqlstring;
}

set
{
sqlstring = value;
}
}

[
Bindable(true),
Browsable(true),
Category("外观"),
Description("用于在编辑模式时文本框的CSS样式.")
]
public string EditTextBoxCssClass
{
get
{
string s = (string)ViewState["EditTextBoxCssClass"];
if (s == null)
return String.Empty;
return s;
}
set
{
ViewState["EditTextBoxCssClass"] = value;
}
}

protected override void OnInit(EventArgs e)
{
// 测试Page确保其不在设计时运行
if (Page != null)
{
//string imagePath = GetClientScriptPath();

EditCommandColumn c0 = new EditCommandColumn();
c0.EditText = "编辑";
c0.CancelText = "取消";
c0.UpdateText = "更新";
c0.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
c0.HeaderStyle.Width = new Unit("100px");
this.Columns.Add(c0);

ButtonColumn c1 = new ButtonColumn();
c1.CommandName = "删除";
c1.Text = "删除";
c1.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
c1.HeaderStyle.Width = new Unit("50px");
this.Columns.Add(c1);

this.ShowFooter = true;
this.ItemStyle.VerticalAlign = VerticalAlign.Top;
}
}

protected override void OnLoad(EventArgs e)
{
// 测试Page确保其不在设计时运行
if (Page != null)
{
// 获得数据
ds = new DataSet();
SqlConnection myConnection = new SqlConnection(ConnectionString);
myDataAdapter = new SqlDataAdapter(sqlstring,myConnection);
objAutoGen = new SqlCommandBuilder(myDataAdapter);
myDataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
myDataAdapter.Fill(ds,TableName);

// 设置数据表
if (TableName != String.Empty)
dt = ds.Tables[TableName];
else
dt = ds.Tables[0];
}

// 在页面首次被装载时应当绑定数据
if (!Page.IsPostBack)
{
shouldRebind = true;
}
}

// 进入编辑模式
protected override void OnEditCommand(DataGridCommandEventArgs e)
{
this.EditItemIndex = e.Item.ItemIndex;
shouldRebind = true;
}

// 取消编辑模式
protected override void OnCancelCommand(DataGridCommandEventArgs e)
{
this.EditItemIndex = -1;
shouldRebind = true;
}

// 删除命令,取消编辑模式
protected override void OnDeleteCommand(DataGridCommandEventArgs e)
{
// 删除引发命令的行
dt.Rows.RemoveAt(e.Item.DataSetIndex);

// 保存更新的数据
Console.WriteLine("Delete: "+objAutoGen.GetDeleteCommand().CommandText);
SaveData();

this.EditItemIndex = -1;
shouldRebind = true;
}

protected override void OnUpdateCommand(DataGridCommandEventArgs e)
{
// 使用DataSetIndex获得指定行的数据
DataRow row = dt.Rows[e.Item.DataSetIndex];

// 获得值并更新
for (int i=0; i<dt.Columns.Count; i++)
{
// 跳过前两列(编辑和删除列)
int j = i + 2;

// 获取文本框的值并将其放到数据集
TextBox t = (TextBox)e.Item.Cells[j].Controls[0];
row[dt.Columns[i].Caption] = t.Text;
}

// 保存更新的数据
Console.WriteLine("Update: "+objAutoGen.GetUpdateCommand().CommandText);
SaveData();

// 取消编辑模式重新绑定数据
this.EditItemIndex = -1;
shouldRebind = true;
}

// 对于编辑框来说,如果太长则以多行呈现
protected override void OnItemDataBound(DataGridItemEventArgs e)
{
if ((ListItemType)e.Item.ItemType == ListItemType.EditItem)
{
foreach(TableCell c in e.Item.Controls)
{
if (c.Controls[0].GetType() == typeof(TextBox))
{
TextBox t = (TextBox)c.Controls[0];
// 设置样式属性
if (this.EditTextBoxCssClass != String.Empty)
t.CssClass = this.EditTextBoxCssClass;
else
t.Style["width"] = "100%";

// 若数据太长,则用多行文本框的形式
int rows = (t.Text.Length / 50) + 1;
if (rows > 1)
{
// 设置文本框为多行文本框
t.TextMode = TextBoxMode.MultiLine;
t.Rows = rows + 3;
}
}
}
}
}

// 在脚注中添加一新增按钮
protected override void OnItemCreated(DataGridItemEventArgs e)
{
if ((ListItemType)e.Item.ItemType == ListItemType.Footer)
{
// 页脚行是一个包含了一个单元格的TableRow
int colcount = e.Item.Cells.Count;
e.Item.Cells.Clear();

// 建立一个新单元格,横跨所有单元格
TableCell c = new TableCell();
c.ColumnSpan = colcount;

// 为新增一条数据建立一LinkButton
LinkButton l = new LinkButton();
l.Click += new EventHandler(AddItem);
l.Text = "新增记录";
l.CssClass = "CommandButton";

// 将LinkButton控件添加到单元格控件中
c.Controls.Add(l);
e.Item.Cells.AddAt(0, c);
}
}

// 该方法在运行时马上调用
protected override void OnPreRender(EventArgs e)
{
if (shouldRebind)
{
this.DataSource = dt;
this.DataBind();
}
}

// 隐藏DataGrid的某些属性
[
Bindable(false),
Browsable(false)
]
public override string DataKeyField
{
get
{
return String.Empty;
}
set
{
}
}

[
Bindable(false),
Browsable(false)
]
public override object DataSource
{
get
{
return base.DataSource;
}
set
{
base.DataSource = value;
}
}

// 保存数据
public void SaveData()
{
myDataAdapter.Update(ds,TableName);
}

// 新增一条记录
void AddItem(Object Src, EventArgs e)
{
// 建立一个新的行
DataRow r = dt.NewRow();

// 初始化该行
for (int i=0; i<dt.Columns.Count; i++)
{
r[dt.Columns[i].Caption] = "";
}

// 将该行添加到表中
dt.Rows.Add(r);

// 保存数据
SaveData();

// 将新增的行设置为编辑模式,重新绑定
this.EditItemIndex = dt.Rows.Count-1;
shouldRebind = true;
}

}
}
...全文
65 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
xn000 2005-05-08
  • 打赏
  • 举报
回复
好长啊,,看不明白。。帮你up

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧