在DataGrid中我利用TemplateColumn添加了一个ImageButton列,即在每行中增加一个图片按钮,用户点击这个图片就实现对该行的删除。aspx源文件如下:
...
<asp:datagrid id="DataGrid_log" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:BoundColumn DataField="id" HeaderText="ID" />
<asp:BoundColumn DataField="name" HeaderText="用户账号" />
<asp:BoundColumn DataField="time" HeaderText="登陆时间" />
<asp:BoundColumn DataField="ip" HeaderText="IP来源" />
<asp:BoundColumn DataField="cmd" HeaderText="登陆状态" />
<asp:TemplateColumn HeaderText="删除">
<ItemTemplate>
<asp:ImageButton ID="del" Runat="server" ImageUrl="images/del.gif" />
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:datagrid>
....asp.cs代码如下:
...
private void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{
BindGrid();
}
}private void BindGrid()
{
OleDbConnection conn=new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Server.MapPath("../access/db1.mdb"));
try
{
conn.Open();
OleDbDataAdapter myAdapter=new OleDbDataAdapter("SELECT * FROM log",conn);
OleDbCommandBuilder myBuilder=new OleDbCommandBuilder(myAdapter);
DataSet myDataSet=new DataSet();
myAdapter.Fill(myDataSet,"log");
DataGrid_log.DataSource=myDataSet;
DataGrid_log.DataBind();
}
catch(Exception error)
{
this.Response.Write(error.ToString ());
}
finally
{
conn.Close();
}
}
//#region Web Form Designer generated code//我的想法是不是在这里定义图片按钮的Click事件,然后在Click事件中重新连接数据库,然后根据ID找到那条记录,再执行删除命令。我也在CSDN上查了以前的帖子,但大多都只帖出部分代码,也不太看得明白,到底怎么将DataGrid中的ID值与这个ImageButton关联起来。//或者我的想法根本就是错误的,而是用其它方法来实现。盼帖出代码再给予常规思路方面的指教,不甚感激!
...
<asp:datagrid id="DataGrid_log" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:BoundColumn DataField="id" HeaderText="ID" />
<asp:BoundColumn DataField="name" HeaderText="用户账号" />
<asp:BoundColumn DataField="time" HeaderText="登陆时间" />
<asp:BoundColumn DataField="ip" HeaderText="IP来源" />
<asp:BoundColumn DataField="cmd" HeaderText="登陆状态" />
<asp:TemplateColumn HeaderText="删除">
<ItemTemplate>
<asp:ImageButton ID="del" Runat="server" ImageUrl="images/del.gif" />
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:datagrid>
....asp.cs代码如下:
...
private void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{
BindGrid();
}
}private void BindGrid()
{
OleDbConnection conn=new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Server.MapPath("../access/db1.mdb"));
try
{
conn.Open();
OleDbDataAdapter myAdapter=new OleDbDataAdapter("SELECT * FROM log",conn);
OleDbCommandBuilder myBuilder=new OleDbCommandBuilder(myAdapter);
DataSet myDataSet=new DataSet();
myAdapter.Fill(myDataSet,"log");
DataGrid_log.DataSource=myDataSet;
DataGrid_log.DataBind();
}
catch(Exception error)
{
this.Response.Write(error.ToString ());
}
finally
{
conn.Close();
}
}
//#region Web Form Designer generated code//我的想法是不是在这里定义图片按钮的Click事件,然后在Click事件中重新连接数据库,然后根据ID找到那条记录,再执行删除命令。我也在CSDN上查了以前的帖子,但大多都只帖出部分代码,也不太看得明白,到底怎么将DataGrid中的ID值与这个ImageButton关联起来。//或者我的想法根本就是错误的,而是用其它方法来实现。盼帖出代码再给予常规思路方面的指教,不甚感激!
解决方案 »
- 100分求解!用过“烁空”Socut.Data.dll 的进来看看
- 【开源】分布式可编程的云平台,可大规模开展Web服务开发,期待专家点评
- 根据ListView控件中性别列的布尔值 改变显示为男女
- 在ASP。Net中,控件的初始化问题
- 我想实现省份县无刷新三级联动,脚本提示AjaxPCA(这是个自定义的命名空间名称)未定义请各位指教
- asp.net mvc3 查询分页出现问题
- 如何使某个目录不应用自定义的HttpHandler?
- IIS 7.5 使用虚拟目录报出的500.19错误
- 孟子e章中的"将DataGrid输出到Excel文件 "怎么调试失败?
- ■■ CheckBoxList问题-----------高分提问
- 新闻系统用户登录?
- 在表示层如何使用数据层返回的SqlDataReader?
把按钮的ConmmandName属性定义为Delete,其实可以自己ConmmandName,但Delete事件是datagird自带的事件,比较方便.
注册Delete事件,就和datagrid联系起来了
this.DataGrid_log.DeleteCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid_log_DeleteCommand);写实现删除的方法
private void DataGrid_log_DeleteCommand(object source, DataGridCommandEventArgs e)
{
conn.Open();
string DeleteCmd = "DELETE FROM log WHERE id = @Uid";
OleDbCommand MyCommand = new OleDbCommand(DeleteCmd,conn);
MyCommand.Parameters.Add(new OleDbParameter("@Uid" ,OleDbType.VarChar,15));
//DataGrid_log.DataKeys[e.Item.ItemIndex];这句是取得当前所在行的ID,
//必须设置一个为DataKey,通常为主键
MyCommand.Parameters["@Uid"].Value = DataGrid_log.DataKeys[e.Item.ItemIndex];
MyCommand.Connection.Open();
try{
MyCommand.ExecuteNonQuery();
Message.Text = "数据记录已经成功删除";
}
catch (OleDbException)
{
Message.Text = "错误: 无法删除数据纪录";
}MyCommand.Connection.Close();
//删除完记得重新绑定
BindGrid();
}不知道我说清楚了没有,应该不是很复杂吧
修改page_load
private void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{
BindGrid();
}
ImageButtonReg();
}
注册ImageButton单击方法
private void ImageButtonReg()
{
if(this.DataGrid1.Items.Count >0)
{
for(int i=0;i<this.DataGrid_log.Items.Count;i++)
{
ImageButton ib=(ImageButton)this.DataGrid_log.Items[i].FindControl("del");
ib.Click +=new EventHandler(ib_Click);
ib.Attributes.Add("onclick","javascript:return confirm('确认是否删除?');");
}
}
}
编写ImageButton单击事件
private void ib_Click(object sender, EventArgs e)
{
ImageButton ib=(ImageButton)sender;
string id=((TableCell)ib.NamingContainer.Controls[0]).Text;
...................//这里根据id执行删除
}
Dim conn As New OleDbConnection("Data Source=""" & Me.Server.MapPath(System.Configuration.ConfigurationSettings.AppSettings("database")) & """;Provider=""Microsoft.Jet.OLEDB.4.0"";User ID=Admin")
Dim i As Integer
conn.Open()
For i = 0 To Me.DataGrid1.Items.Count - 1
Dim chk As CheckBox = CType(Me.DataGrid1.Items.Item(i).FindControl("checkbox1"), CheckBox)
If chk.Checked Then
Dim mycom As New OleDbCommand("DELETE FROM T_UserPropose where ProposeID = " & Me.DataGrid1.Items.Item(i).Cells(0).Text & " ", conn)
If mycom.ExecuteNonQuery > 0 Then
Me.Label1.Text = "已经成功删除所选择的建议!"
End If
End If
Next
conn.Close()
bindgrid()
End Sub
<SelectedItemStyle Font-Bold="True" ForeColor="#F7F7F7" BackColor="#738A9C"></SelectedItemStyle>
<AlternatingItemStyle BackColor="#F7F7F7"></AlternatingItemStyle>
<ItemStyle ForeColor="#4A3C8C" BackColor="#E7E7FF"></ItemStyle>
<HeaderStyle Font-Bold="True" ForeColor="#F7F7F7" BackColor="#4A3C8C"></HeaderStyle>
<FooterStyle ForeColor="#4A3C8C" BackColor="#B5C7DE"></FooterStyle>
<Columns>
<asp:BoundColumn DataField="FileName" ReadOnly="True" HeaderText="FileName"></asp:BoundColumn>
<asp:BoundColumn DataField="Provider" ReadOnly="True" HeaderText="Provider"></asp:BoundColumn>
<asp:BoundColumn DataField="Up_date" HeaderText="InDate" DataFormatString="{0:MM/dd/yyyy}"></asp:BoundColumn>
<asp:TemplateColumn HeaderText="View">
<ItemTemplate>
<asp:LinkButton ID="update" ForeColor="blue" Runat="server" text="View" commandname="update"></asp:LinkButton>
<asp:LinkButton id="cmdDel" ForeColor="blue" runat="server" Text="Delete" CommandName="Delete"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
<PagerStyle NextPageText="" PrevPageText="" HorizontalAlign="Right" ForeColor="#4A3C8C" BackColor="#E7E7FF"></PagerStyle>
</asp:datagrid>
<asp:TemplateColumn HeaderText="删除">
<ItemTemplate>
<asp:ImageButton id="btn_delete" runat="server" CommandName="delete" ImageUrl="../images/delete.gif" ToolTip="删除"></asp:ImageButton>
</ItemTemplate>
</asp:TemplateColumn>
在后台DataGrid的事件中写实现代码
private void DataGrid1_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
//在此写实现代码
}
<ItemTemplate> //加个hidden类型的控件,它的值来记录你要的id号。
<input type="hidden" id="hdID" runat="server"> <asp:ImageButton ID="del" Runat="server" ImageUrl="images/del.gif" />
</ItemTemplate>
</asp:TemplateColumn>
在删除的时候直接利用findControl()方法找到该隐藏控件的值,就可以实现删除了。
MSDN WebCast 讲座下载(Datagrid高级使用技巧)
特别是//DataGrid_log.DataKeys[e.Item.ItemIndex];这句是取得当前所在行的ID,
//必须设置一个为DataKey,通常为主键在html中创建DataGrid也可以设置datakey主键,然后就简单了。