2017-07-03 4 views
0

Ich versuche, Inhalt in meine lokale Datenbank aus einem Textfeld in einem Repeater-Element, in einer Post-Kommentar-Art einfügen. Bis jetzt habe ich versucht, alle generierten Zeilen zu loopen, um das spezifische Textfeld zu finden, aber ich hatte kein Glück, entweder die Einfügung wird leer, oder ich bekomme 1 Einfügung pro bereits existierende Zeile, oder ich bekomme den gleichen Wert immer wieder eingefügt durch verschiedene Beiträge.Repeater - Textbox Inhalt in Datenbank C#

Ich habe schließlich versucht, die Post-ID an den Itemfinder zu übergeben und es funktioniert irgendwie, aber die "comm_contenido" -Einfügungen aus dem Textfeld werden immer noch leer in die Datenbank.

Meine Frage ist, was es ist die richtige und direktere Art, diese Art von Einsätzen von innerhalb eines Repeaters zu behandeln.

C#:

protected void Button1_Command(object sender, CommandEventArgs e) 
{ 

    string postid = e.CommandArgument.ToString(); 
    string emailcc = Session["EMAIL"].ToString(); 
    string user_id = Session["ID"].ToString(); 
    string usrnom = Session["NOMBRE"].ToString(); 
    string usrfoto = Session["FOTO_URL"].ToString(); 
    //string COMM_CONTENIDO = lblcomm.Text.ToString(); 

    var COMM_fecha = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); 
    TextBox txt2; 

     using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConexionBD"].ConnectionString)) 
     { 
      using (SqlCommand cmd = new SqlCommand()) 
      { 

       int m = Int32.Parse(postid); 
       txt2 = (TextBox)Repeater_UsrPosts.Items[m].FindControl("txtcomentar"); 
       string txt1 = txt2.Text; 

       cmd.CommandType = CommandType.Text; 
       cmd.CommandText = (@"INSERT INTO MIEMBROS_Comments (COMM_USER_ID, COMM_CONTENIDO, COMM_FECHA, COMM_USER_NOMBRE, COMM_USER_FOTO, COMM_POST_ID) VALUES ('" 
       + user_id + "','" + txt1 + "','" + COMM_fecha + "','" + usrnom + "','" + usrfoto + "','" + postid + "');"); 
       cmd.Connection = conn; 
       conn.Open(); 
       int rowsAffected = cmd.ExecuteNonQuery(); 
      } 
     } 

     //txtpublica.Text = ""; 
     traerposts(); 

} 

ASP:

<asp:Repeater ID="Repeater_UsrPosts" runat="server" > 
    <ItemTemplate> 

     <!-- Post --> 
     <div class="post clearfix"> 
      <div class="user-block"> 



       <img alt="" src="<%#Eval("post_user_foto")%>" class="img-circle img-bordered-sm" /> 

       <span class="username"> 
        <a href="#"><%#Eval("post_user_nombre") %></a> 
        <a href="#" class="pull-right btn-box-tool"><i class="fa fa-times"></i></a> 
       </span> 
       <span class="description"><%#Eval("post_fecha") %></span> 
      </div> 
      <!-- /.user-block --> 

      <p> 

       <%#Eval("post_contenido") %> 
      </p> 

      <ul class="list-inline"> 
       <li><a href="#" class="link-black text-sm"><i class="fa fa-share margin-r-5"></i>Share</a></li> 
       <li><a href="#" class="link-black text-sm"><i class="fa fa-thumbs-o-up margin-r-5"></i>Like</a> 
       </li> 
       <li class="pull-right"> 
        <asp:LinkButton ID="bttnabrircomentarios" runat="server" class="link-black text-sm"> 
         <i class="fa fa-comments-o margin-r-5"></i>Comments</asp:LinkButton> 
       </li> 
      </ul> 

      <asp:TextBox ID="txtcomentar" runat="server" class="form-control input-sm" placeholder="Escribe un comentario" EnableViewState="False"></asp:TextBox> 

      <%# Eval("post_id") %> - 

      <asp:Button ID="Button1" runat="server" Text="Button" 
       OnCommand="Button1_Command" CommandName="myCommand" 
       CommandArgument='<%# Eval("post_ID") %>' /> 
      <br /> 
     </div> 
     <!-- /.post --> 
    </ItemTemplate> 
</asp:Repeater> 
+1

zeigen Sie das Laden in den Repeater-Code. Wird es in jedem Post geladen? BTW, sobald Sie es funktioniert haben, sollten Sie einen Schritt weiter gehen und die SQL-Injektion in Ihrem Code vermeiden. – bradbury9

+0

Das Textfeld wird auf jeden Post geladen, ja. Und danke, ich werde es tun, sobald ich das funktioniere. – Ghaamae

+0

Sie sollten es nicht auf jeden Post laden. Wenn das Ereignis 'Button1_Command' nach dem Datenladevorgang ausgelöst wird, nehme ich' Page_Load' an, dann gehen die vom Benutzer eingegebenen Daten verloren. Laden Sie die Daten nur einmal, überprüfen Sie die Eigenschaft 'Page.IsPostback'. Bearbeiten: Lesen Sie einfach die Antwort bezieht sich auf die IsPostBack ... Überprüfen Sie Omars Antwort :-) – bradbury9

Antwort

0

Das waren die Änderungen, die für mich die richtige Textbox ausfindig gemacht haben und die Veröffentlichung unerwünschter Daten verhindert haben.

C#:

protected void Button1_Command(object sender, CommandEventArgs e) 
{ 

    string postid = e.CommandArgument.ToString(); 
    string emailcc = Session["EMAIL"].ToString(); 
    string user_id = Session["ID"].ToString(); 
    string usrnom = Session["NOMBRE"].ToString(); 
    string usrfoto = Session["FOTO_URL"].ToString(); 

    var COMM_fecha = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); 
Control s = (Control)sender; 
    TextBox tb = (TextBox)s.NamingContainer.FindControl("txtcomentar"); 
    tb.ReadOnly = true; 
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConexionBD"].ConnectionString)) 
    { 
     using (SqlCommand cmd = new SqlCommand()) 
     { 

      string txt1 = tb.Text; 

      cmd.CommandType = CommandType.Text; 
      cmd.CommandText = (@"INSERT INTO MIEMBROS_Comments (COMM_USER_ID, COMM_CONTENIDO, COMM_FECHA, COMM_USER_NOMBRE, COMM_USER_FOTO, COMM_POST_ID) VALUES ('" 
      + user_id + "','" + txt1 + "','" + COMM_fecha + "','" + usrnom + "','" + usrfoto + "','" + postid + "');"); 
      cmd.Connection = conn; 
      conn.Open(); 
      int rowsAffected = cmd.ExecuteNonQuery(); 
     } 
    } 
    traerposts(); 
} 

Und auf der ASP habe ich die Eigenschaft EnableViewState = "true" auf die Textbox und auch an den Repeater.

Zuletzt, am wichtigsten, habe ich If (! Page.IsPostBack) zu dem Onload-Ereignis hinzugefügt.

Und mit all dem zusammen werden die Kommentare zu jedem Beitrag korrekt eingefügt.

1

Sie können durch die Zuordnung OnTextChanged zu der TextBox Kontrolle erreichen, und man kann auch seine AutoPostBack zu true zuweisen, wenn Sie die Daten erreichen wollen sofort.

aber Sie sollten if(!IsPostBack) verwenden, bevor Sie Ihre Daten an Ihren Repeater binden, so dass es Ihre Controls nicht zurückgesetzt, bevor Sie die Daten erreichen konnten.

OnTextChanged zwei Parameter benötigt, einer von ihnen ist die sender Objekt, das es ruft, das ist Ihr TextBox, so etwas wie ..

ASP

<asp:Repeater ID="RepeaterExample" runat="server"><ItemTemplate> 
    <asp:TextBox runat="server" ID="TextBoxExample" AutoPostBack="True" OnTextChanged="TextBoxExample_OnTextChanged"/> 
</ItemTemplate></asp:Repeater> 

Hinter-Code

protected void TextBoxExample_OnTextChanged(object sender, EventArgs e) 
{ 
    TextBox txt = (TextBox) sender; 
    //Response.Write(txt.Text); 
    //or whatever you want to do with it. 
} 

und wenn Sie es mit Button_OnClick verwenden möchten, sollten Sie wie eine globale Zeichenfolge verwenden, die Sie später aufrufen können, können Sie so etwas tun ..

ASP

<asp:Button runat="server" ID="ButtonExample" OnClick="ButtonExample_OnClick"/> 

Hinter-Code

private string text = ""; 

protected void TextBoxTest_OnTextChanged(object sender, EventArgs e) 
{ 
    TextBox txt = (TextBox)sender; 
    text = txt.Text; 
} 

protected void ButtonExample_OnClick(object sender, EventArgs e) 
{ 
    //Response.Write(text); 
} 

aber die letzte Methode wird den Wert des letzten TextBox dessen Text hat sich geändert nehmen, wenn Sie es zusammen fügen wie ..

text += txt.Text; 

Hoffnung, ich könnte helfen ..

+0

Ihre Antwort passt auf ein anderes Szenario, Es funktioniert nicht für mich, da ich den Button-Befehl verwenden, um die Post-ID zu bringen. – Ghaamae