在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关联起来。//或者我的想法根本就是错误的,而是用其它方法来实现。盼帖出代码再给予常规思路方面的指教,不甚感激!

解决方案 »

  1.   

    你不能直接定义GataGrid中按钮的Click事件,因为会输出很多按钮,最后每个生成的按钮ID都不一样.通常的方法
    把按钮的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();
    }不知道我说清楚了没有,应该不是很复杂吧
      

  2.   

    根据你的意思可以这样写:
    修改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执行删除
    }
      

  3.   

    模版列中放一个 checkbox,根据他是否选中来删除   Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
            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
      

  4.   

    <asp:datagrid id="datagrid1" Runat="server" OnUpdateCommand="datagrid1_update" OnDeleteCommand="datagrid1_delete" width="100%" gridlines="None" pagesize="5" autogeneratecolumns="false" allowpaging="true">
    <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>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <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>
      

  5.   

    如果只是在删除时加一图片的话,可以创建一删除列
    <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)
    {
    //在此写实现代码
    }
      

  6.   

    <asp:TemplateColumn HeaderText="删除">
          <ItemTemplate>        //加个hidden类型的控件,它的值来记录你要的id号。
            <input type="hidden" id="hdID" runat="server">        <asp:ImageButton ID="del" Runat="server" ImageUrl="images/del.gif" />
          </ItemTemplate>
        </asp:TemplateColumn>
    在删除的时候直接利用findControl()方法找到该隐藏控件的值,就可以实现删除了。
      

  7.   

    感谢各位提供不同的方法,特别感谢一楼afdfgg(午夜飞行)详细的讲解,除去了我心头隐藏好久的迷惑。结账!再次感谢各位。
      

  8.   

    http://blog.csdn.net/jaguar1982/archive/2005/01/25/267394.aspx
    MSDN WebCast 讲座下载(Datagrid高级使用技巧)
      

  9.   

    我也从中学到不少东西呀!
    特别是//DataGrid_log.DataKeys[e.Item.ItemIndex];这句是取得当前所在行的ID,
    //必须设置一个为DataKey,通常为主键在html中创建DataGrid也可以设置datakey主键,然后就简单了。