net asp asp.net gridview postback

asp.net - asp - Evento de GridView RowCommand y guardar texto



rowcommand in gridview in asp net (1)

prueba esta estructura ...

página aspx: (nota textarea tiene runat="server" )

<body> <form runat="server"> <asp:ScriptManager runat="server" /> <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnRowCommand="GridView1_RowCommand" EnableViewState="true" OnRowDataBound="GridView1_RowDataBound"> <Columns> <asp:TemplateField HeaderText="Delete" ItemStyle-HorizontalAlign="Center"> <ItemTemplate> <asp:Button runat="server" ID="Delete" Text="Delete" /> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Comment" ItemStyle-Width="175px"> <ItemTemplate> <textarea runat="server" class="raTextBox" id="txtItemComment" rows="4" cols="30"></textarea></ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> </ContentTemplate> </asp:UpdatePanel> </form> </body>

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]; } }

Tengo una configuración 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>

El RowCommand en código subyacente se configura como:

Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) If (e.CommandName = "DeleteRow") Then //do stuff here

El GridView está enlazado a datos en la carga de página de la siguiente manera:

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

Mis preguntas:

  1. El evento de comando de fila nunca se activa. La página simplemente entra en el ELSE (de Not is Postback) en Page_Load
  2. ¿Cómo puedo realizar un seguimiento de todo lo que se escribe en la columna "Comentarios" de cada fila (un TEXTAREA) y guardar los datos en la base de datos cuando se hace clic en el botón GUARDAR CAMBIOS (formulario)?

¡Gracias!

ACTUALIZACIÓN: El enlace de datos de Grid-View es el siguiente:

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

Básicamente, el GridView tiene tres columnas visibles: un campo de comentarios, un campo de imagen y un campo con un botón de eliminación (imagen) para eliminar la imagen (y los comentarios, si corresponde) de la base de datos. La cuarta columna es una oculta, haciendo un seguimiento de la identificación de la imagen de las imágenes. No incluí la imagen y otras columnas por razones de simplicidad.

  • El usuario puede agregar comentarios, y cuando hace clic en el botón "GUARDAR CAMBIOS", los comentarios correspondientes deben guardarse para la imagen.
  • La ''SELECCIONAR IMAGEN'' abre un ModalDialogBox que permite al usuario seleccionar la imagen. Cuando se cierra, provoca una devolución de datos y vuelve a vincular la vista de cuadrícula para mostrar la imagen que el usuario acaba de seleccionar. Por lo tanto, necesito el GridView para volver a vincular en la devolución de datos, o una forma de evitar esto.
  • El botón borrar imagen (en vista de cuadrícula) debería eliminar la imagen y los comentarios de la base de datos.

¡Gracias de nuevo!