Asp.net GridView行命令事件和保存文本

Asp.net GridView行命令事件和保存文本,asp.net,gridview,postback,Asp.net,Gridview,Postback,我已设置GridView: <asp:GridView id="GridView1" Runat="server" AutoGenerateColumns="False" OnRowCommand = "GridView1_RowCommand" EnableViewState="true"> <Columns> <asp:TemplateField HeaderText="Delete" ItemStyle-HorizontalAlign="C

我已设置GridView:

<asp:GridView id="GridView1" Runat="server" AutoGenerateColumns="False" OnRowCommand = "GridView1_RowCommand" EnableViewState="true">
   <Columns>
       <asp:TemplateField HeaderText="Delete" ItemStyle-HorizontalAlign="Center"> 
            <ItemTemplate><asp:Button runat="server" ID="Delete" ImageUrl="~/images/Close.gif" CommandName="DeleteRow" CommandArgument="<%# CType(Container,GridViewRow).RowIndex %>"/></ItemTemplate></asp:TemplateField>

       <asp:TemplateField HeaderText="Comment" ItemStyle-Width="175px">
            <ItemTemplate><textarea class="raTextBox" id="txtItemComment" rows="4" cols="30"></textarea></ItemTemplate></asp:TemplateField> 
   </Columns>   
</asp:GridView>
GridView在页面加载时进行数据绑定,如下所示:

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  If Not IsPostBack Then
     Session("CalledModule") = "RCMT0021"
  Else
      With ViewState
           _intRepor = CInt(.Item("Report"))
      End With
  End If
     DataBind()   //Gridview Load
End Sub
Public Sub DataBind()
Dim clsDatabase As New clsDatabase
Dim cmd As New OleDbCommand()
Try
 cmd.CommandText = "SELECT A, B FROM WHERE C = ? ORDER BY A"
   Dim report As New OleDbParameter("@Report", _intReportNumber)
   cmd.Parameters.Add(report)

   cmd.Connection = clsDatabase.Open_DB()
   Dim dReader As OleDbDataReader
   dReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)

   Dim dt As New DataTable
   dt.Columns.Add(New DataColumn("PictureURL", GetType(String)))
   dt.Columns.Add(New DataColumn("Seq", GetType(Int16)))
   dt.Columns.Add(New DataColumn("ReportNumber", GetType(String)))

   Do While (dReader.Read())
      Dim dr As DataRow = dt.NewRow()

      _strComments = dReader(0).ToString
      dr("Seq") = dReader.GetInt16(1)
      dr("PictureURL") = "GetImages.aspx?report=" + _intReportNumber.ToString + "&seq=" + dReader.GetInt16(1).ToString
      dr("ReportNumber") = _intReportNumber.ToString
      dt.Rows.Add(dr)
   Loop

   GridView1.DataSource = dt
   GridView1.DataBind()

  Catch err As Exception
 End Try
End Sub
我的问题是:

  • 永远不会触发row命令事件。页面只是进入页面加载中的ELSE(of Not is Postback)
  • 如何跟踪每行(文本区域)的“注释”列中键入的所有内容,并在单击保存更改(表单)按钮时将数据保存到数据库
  • 谢谢

    更新: 网格视图的数据绑定如下所示:

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      If Not IsPostBack Then
         Session("CalledModule") = "RCMT0021"
      Else
          With ViewState
               _intRepor = CInt(.Item("Report"))
          End With
      End If
         DataBind()   //Gridview Load
    End Sub
    
    Public Sub DataBind()
    Dim clsDatabase As New clsDatabase
    Dim cmd As New OleDbCommand()
    Try
     cmd.CommandText = "SELECT A, B FROM WHERE C = ? ORDER BY A"
       Dim report As New OleDbParameter("@Report", _intReportNumber)
       cmd.Parameters.Add(report)
    
       cmd.Connection = clsDatabase.Open_DB()
       Dim dReader As OleDbDataReader
       dReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
    
       Dim dt As New DataTable
       dt.Columns.Add(New DataColumn("PictureURL", GetType(String)))
       dt.Columns.Add(New DataColumn("Seq", GetType(Int16)))
       dt.Columns.Add(New DataColumn("ReportNumber", GetType(String)))
    
       Do While (dReader.Read())
          Dim dr As DataRow = dt.NewRow()
    
          _strComments = dReader(0).ToString
          dr("Seq") = dReader.GetInt16(1)
          dr("PictureURL") = "GetImages.aspx?report=" + _intReportNumber.ToString + "&seq=" + dReader.GetInt16(1).ToString
          dr("ReportNumber") = _intReportNumber.ToString
          dt.Rows.Add(dr)
       Loop
    
       GridView1.DataSource = dt
       GridView1.DataBind()
    
      Catch err As Exception
     End Try
    End Sub
    

    因此,GridView基本上有三个可见列—注释字段、图片字段和带有删除按钮(图像)的字段,用于从数据库中删除图片(以及注释,如果有的话)。第四列是隐藏列,用于跟踪图像的图像ID。为了简单起见,我没有包括图片和其他专栏

    • 用户可以添加注释,当他单击“保存更改”按钮时,应为图片保存相应的注释
    • 选择图像”打开一个ModalDialogBox,使用户可以选择图像。关闭后,它会导致回发,并重新绑定gridview以显示用户刚刚选择的图像。因此,我需要GridView在回发时重新绑定,或者找到一种解决方法。
    • 删除图像按钮(在gridview中)应从数据库中删除图像和注释
    再次感谢

    试试这个结构

    aspx页面:(注意
    textarea
    runat=“server”

    
    
    aspx.cs:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            BindGrid();
        }
    }
    
    protected void BindGrid()
    {
        var items = new List<string>();
        for (int i = 0; i < 10; i++)
        {
            items.Add(i + ";comment" + i.ToString());
        }
        GridView1.DataSource = items;
        GridView1.DataBind();
    }
    
    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "DeleteRow")
        {
            var idx = Convert.ToInt32(e.CommandArgument);
            var cmt = GridView1.Rows[idx].FindControl("txtItemComment") as System.Web.UI.HtmlControls.HtmlTextArea;
            cmt.Value = DateTime.Now.ToString();
        }
    }
    
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            var item = e.Row.DataItem.ToString().Split(";".ToCharArray());
    
            var del = e.Row.FindControl("Delete") as Button;
            del.CommandName = "DeleteRow";
            del.CommandArgument = item[0];
    
            var cmt = e.Row.FindControl("txtItemComment") as System.Web.UI.HtmlControls.HtmlTextArea;
            cmt.Value = item[1];
        }
    }
    
    受保护的无效页面加载(对象发送方,事件参数e)
    {
    如果(!Page.IsPostBack)
    {
    BindGrid();
    }
    }
    受保护的void BindGrid()
    {
    var items=新列表();
    对于(int i=0;i<10;i++)
    {
    添加(i+“注释”+i.ToString());
    }
    GridView1.DataSource=项目;
    GridView1.DataBind();
    }
    受保护的void GridView1_row命令(对象发送方,GridViewCommandEventArgs e)
    {
    如果(e.CommandName==“DeleteRow”)
    {
    var idx=Convert.ToInt32(e.CommandArgument);
    var cmt=GridView1.Rows[idx].FindControl(“txtItemComment”)作为System.Web.UI.HtmlControls.HtmlTextArea;
    cmt.Value=DateTime.Now.ToString();
    }
    }
    受保护的void GridView1_RowDataBound(对象发送方,GridViewRowEventArgs e)
    {
    如果(e.Row.RowType==DataControlRowType.DataRow)
    {
    var item=e.Row.DataItem.ToString().Split(“;”.ToCharArray());
    var del=e.Row.FindControl(“删除”)作为按钮;
    del.CommandName=“DeleteRow”;
    del.CommandArgument=项[0];
    var cmt=e.Row.FindControl(“txtItemComment”)作为System.Web.UI.HtmlControls.HtmlTextArea;
    cmt.值=项目[1];
    }
    }
    
    试试这个结构

    aspx页面:(注意
    textarea
    runat=“server”

    
    
    aspx.cs:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            BindGrid();
        }
    }
    
    protected void BindGrid()
    {
        var items = new List<string>();
        for (int i = 0; i < 10; i++)
        {
            items.Add(i + ";comment" + i.ToString());
        }
        GridView1.DataSource = items;
        GridView1.DataBind();
    }
    
    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "DeleteRow")
        {
            var idx = Convert.ToInt32(e.CommandArgument);
            var cmt = GridView1.Rows[idx].FindControl("txtItemComment") as System.Web.UI.HtmlControls.HtmlTextArea;
            cmt.Value = DateTime.Now.ToString();
        }
    }
    
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            var item = e.Row.DataItem.ToString().Split(";".ToCharArray());
    
            var del = e.Row.FindControl("Delete") as Button;
            del.CommandName = "DeleteRow";
            del.CommandArgument = item[0];
    
            var cmt = e.Row.FindControl("txtItemComment") as System.Web.UI.HtmlControls.HtmlTextArea;
            cmt.Value = item[1];
        }
    }
    
    受保护的无效页面加载(对象发送方,事件参数e)
    {
    如果(!Page.IsPostBack)
    {
    BindGrid();
    }
    }
    受保护的void BindGrid()
    {
    var items=新列表();
    对于(int i=0;i<10;i++)
    {
    添加(i+“注释”+i.ToString());
    }
    GridView1.DataSource=项目;
    GridView1.DataBind();
    }
    受保护的void GridView1_row命令(对象发送方,GridViewCommandEventArgs e)
    {
    如果(e.CommandName==“DeleteRow”)
    {
    var idx=Convert.ToInt32(e.CommandArgument);
    var cmt=GridView1.Rows[idx].FindControl(“txtItemComment”)作为System.Web.UI.HtmlControls.HtmlTextArea;
    cmt.Value=DateTime.Now.ToString();
    }
    }
    受保护的void GridView1_RowDataBound(对象发送方,GridViewRowEventArgs e)
    {
    如果(e.Row.RowType==DataControlRowType.DataRow)
    {
    var item=e.Row.DataItem.ToString().Split(“;”.ToCharArray());
    var del=e.Row.FindControl(“删除”)作为按钮;
    del.CommandName=“DeleteRow”;
    del.CommandArgument=项[0];
    var cmt=e.Row.FindControl(“txtItemComment”)作为System.Web.UI.HtmlControls.HtmlTextArea;
    cmt.值=项目[1];
    }
    }
    

    你试过什么?您是否将断点放在GridView1_row命令(…)中?在您的代码中,没有
    保存更改
    按钮。另外,请发布gridview的数据绑定代码。这将有助于解决
    RowCommand
    问题。如果没有,请尝试将DataBind()函数放入其中postback@tunmisefasipe:是的,它从未到达断点。@karthi:我不能这样做,因为当我加载页面时,以及当ModalDialog关闭时,gridview需要进行数据绑定,然后在页面上回发。你试过什么?您是否将断点放在GridView1_row命令(…)中?在您的代码中,没有
    保存更改
    按钮。另外,请发布gridview的数据绑定代码。这将有助于解决
    RowCommand
    问题。如果没有,请尝试将DataBind()函数放入其中postback@tunmisefasipe:是的,它从未到达断点。@karthi:我不能这样做,因为当我加载页面时,以及当ModalDialog关闭时,gridview需要进行数据绑定,并在页面上回发。我更新了帖子,为您提供有关我的问题的更多信息。注释框将是用户输入字段,每个字段随附一张图片,用于对该图片进行注释。它们都需要在c上更新