2017-02-24 5 views
0

Ich habe eine GridView mit Radiobuttonlist Vorlage Spalte und t extbox in Fußzeile. Ich möchte, dass die Optionsschaltflächen bei Auswahl sofort aktualisiert werden und dieses Lernprogramm verwendet, um die gewünschte Funktionalität http://www.dotnetcurry.com/ShowArticle.aspx?ID=261 zu erreichen. Es funktioniert großartig.Textfeld zeigt alten Wert nach Postback während Datenbank erfolgreich mit neuem Wert aktualisiert

Wenn ein neuer Wert in der Textbox der Fußzeile geändert wird, wird SQL erfolgreich über SqlDataSource Update() im TextChanged() - Ereignis aktualisiert, ABER der alte Wert wird nach dem Postback im Textfeld zurückgegeben. Als Kontrolle übergebe ich einem Label auf der Seite einen neuen Wert, der ebenfalls korrekt angezeigt wird.

Ich habe versucht, GridView1.DataBind() in Page_Load() von If (! IsPostBack) setzen, aber das RadioButtonlist Elemente nicht bleiben ausgewählt, wenn sie geändert werden und sqldatasource nicht aktualisiert wird.

Ich weiß nicht, ob dies relevant ist, aber weil diese App ein Prototyp ist, lade ich gerade einen bestimmten Datensatz in Gridview nach dem Laden der Seite, wenn Benutzer die MYID in ein Textfeld eingibt und auf eine Schaltfläche klickt. Schließlich wird das Raster mit dem über QueryString von einer anderen Seite gelieferten Wert geladen.

Im Wesentlichen möchte ich die Textbox wie die radiobuttonlist arbeiten ... Sobald der Wert geändert wird, möchte ich die Datenbank aktualisieren und den neuen Wert in grid/textbx nach dem Postback anzeigen. Gibt es etwas Offensichtliches, das mir fehlt?

UPDDATE: hinzugefügt Radiobuttonlist SelectedIndexChanged-Ereigniscode UPDATE 2: hinzugefügt SqlDataSource UPDATE 3: Lösung SQL-Datenbank direkt über benutzerdefinierte Methode zu aktualisieren war, entfernt, um die zweite Update-Abfrage in SqlDataSource. TextChanged-Ereigniscode aktualisiert und benutzerdefinierte Methode hinzugefügt.

HTML:

<asp:GridView ID="GridView1" runat="server" 
     AutoGenerateColumns="False" 
     DataKeyNames="MYID" 
     DataSourceID="SqlDataSource1" 
     onrowdatabound="GridView1_RowDataBound" 
     ShowFooter="True" > 
     <Columns> 
<asp:BoundField DataField="MYID" HeaderText="MYID" ReadOnly="True" 
       SortExpression="MYID" /> 
      <asp:BoundField DataField="DocID" HeaderText="DocID" ReadOnly="True" 
       SortExpression="DocID" /> 
      <asp:BoundField DataField="ItemID" HeaderText="ItemID" 
       InsertVisible="False" ReadOnly="True" SortExpression="ItemID" /> 
      <asp:TemplateField HeaderText="Item" SortExpression="Item"> 
       <ItemTemplate> 
        <asp:Label ID="Label1" runat="server" Text='<%# Bind("Item") %>'></asp:Label> 
       </ItemTemplate> 
       <FooterTemplate > 
       <asp:TextBox ID="txtComment1" runat="server" 
        Text='Section 1 Comments' AutoPostBack="True" 
        ontextchanged="txtComment1_TextChanged" MaxLength="1000" 
        TextMode="MultiLine" Width="650px"></asp:TextBox> 
      </FooterTemplate> 
      </asp:TemplateField> 
       <asp:TemplateField HeaderText=" -- 1 -- 2 -- 3 -- 4 -- 5 -- " >  
        <ItemTemplate> 
       <asp:RadioButtonList AutoPostBack="True" ID="rblRating" runat="server" 
        Enabled="true" SelectedIndex='<%#Convert.ToInt32(DataBinder.Eval(Container.DataItem , "Rating"))%>' 
        OnSelectedIndexChanged="rblRating_SelectedIndexChanged" RepeatDirection="Horizontal"> 
        <asp:ListItem Value="0">0</asp:ListItem> 
        <asp:ListItem Value="1">1</asp:ListItem> 
        <asp:ListItem Value="2">2</asp:ListItem> 
        <asp:ListItem Value="3">3</asp:ListItem> 
        <asp:ListItem Value="4">4</asp:ListItem> 
        <asp:ListItem Value="5">5</asp:ListItem>       
       </asp:RadioButtonList> 
      </ItemTemplate> 

     </asp:TemplateField> 
      <asp:BoundField DataField="Rating" HeaderText="Rating" 
       SortExpression="Rating" ReadOnly="True" /> 
     </Columns> 
    </asp:GridView> 
     <asp:Label ID="lblComments1" runat="server" Text="Label"></asp:Label> 
    </div> 

.CS:

protected void UpdateComment1(int myid, string comment) 
     {             
      using (SqlConnection con = new SqlConnection(conStr))) 
     { 
     string cmdStr = "UPDATE tblComments SET Comment1 = @Comment1 WHERE MYID = @MYID"; 

       using (SqlCommand cmd = new SqlCommand(cmdStr, con))) 
       { 
       cmd.Parameters.AddWithValue("@MYID", myid); 
       cmd.Parameters.AddWithValue("@Comment1", comment); 
       try 
       { 
        con.Open(); 
        int affectedRows = cmd.ExecuteNonQuery(); 
       } 
       catch (SqlException ex) 
       { 
        Response.Write(ex.Message); 
       } 
     } 
     } 
     } 
protected void txtComment1_TextChanged(object sender, EventArgs e) 
     { 
      TextBox tbox = (TextBox)sender; 
      string oldComment1 = ViewState["OldComment1"].ToString(); //value saved from PreRender() 
      string newComment1 = (GridView1.FooterRow.FindControl("txtComment1") as TextBox).Text; 
      ViewState["Section1Comments"] = newComment1; 

       if(oldComment1 != newComment1) 
       { 
        //<<TODO>>update history table 
       } 

      if (newComment1 != null) 
      { 
      //update SQL directly via custom method     
       UpdateComment1(Convert.ToInt32(MYID), newComment1); 
      } 
      GridView1.DataBind(); 
     } 

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
     { 
      DataRowView drv = e.Row.DataItem as DataRowView; 
      RadioButtonList rbtnl = (RadioButtonList)e.Row.FindControl("rblRating"); 

      if (e.Row.RowType == DataControlRowType.DataRow) 
      { 
       if ((e.Row.RowState & DataControlRowState.Normal) > 0) //.Edit, .Normal, .Alternate, .Selected 
       { 
      //check for null 
        if (rbtnl.SelectedItem != null) 
        { 
         if (rbtnl.SelectedItem.Text == "0") //if rating isn’t inserted into SQL yet, deselect all 5 radio buttons 
         { 
          rbtnl.SelectedItem.Selected = false; 
         } 
          rbtnl.SelectedValue = drv[4].ToString(); 
        } 
       } 

       //remove extra list item 
       ListItem blank = rbtnl.Items.FindByValue("0"); 
       if (blank != null) 
       { 
        rbtnl.Items.Remove(blank);//always remove list item at index zero 
       } 
      } 
     } 

protected void rblRating_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      string rate = string.Empty; 

      RadioButtonList rBtnList = (RadioButtonList)sender; 
      GridViewRow gvr = (GridViewRow)rBtnList.Parent.Parent; 

      if (rBtnList.SelectedValue != null) 
      { 
       rate = rBtnList.SelectedValue; 

       SqlDataSource1.UpdateParameters["Rating"].DefaultValue = rate; 
       SqlDataSource1.UpdateParameters["MYID"].DefaultValue = gvr.Cells[0].Text; 
       SqlDataSource1.UpdateParameters["ItemID"].DefaultValue = gvr.Cells[2].Text; 
      } 
      else 
      {  
      } 
      SqlDataSource1.Update(); 
      GridView1.DataBind(); 
     } 

SQL & SqlDataSource:

<asp:SqlDataSource 
    ID="SqlDataSource1" 
    runat="server" 
    ConnectionString="<%$ ConnectionStrings:SomeConnectionString %>" 
    SelectCommand="SelectSection1" 
    UpdateCommand="UPDATE tblDetails SET Rating = @Rating WHERE MYID = @myid AND ItemID = @ItemID; 
    --UPDATE [tblComments] SET [Comment1] = @Comment1 WHERE MYID [email protected]; " 
    SelectCommandType="StoredProcedure" > 
     <SelectParameters> 
      <asp:ControlParameter ControlID="TextBox1" DefaultValue="0"    Name="eprid" PropertyName="Text" Type="Int32" /> 
     </SelectParameters> 
     <UpdateParameters> 
      <asp:Parameter Name="Rating" Type="Int32" /> 
      <asp:Parameter Name="myid" Type="Int32" /> 
      <asp:Parameter Name="ItemID" Type="Int32" /> 
      <asp:Parameter Name="Comment1" Type="String" /> 
      </UpdateParameters> 
</asp:SqlDataSource> 

ALTER PROCEDURE [dbo].[SelectSection1] 
    @myid int 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

--Has Form been submitted to tblComments yet? 
declare @docid int 
set @docid =(select distinct d.docid  
    from dbo.tblEmployee e 
    full outer join dbo.tblDetails d on e.MYID = d.myid 
    where e.myid = @myid) 

IF @docid is null 

----if not submitted yet, fill grid with evaluation items only, set rating to NULL 
BEGIN 
SELECT 
     @myid As MYID 
     ,0 as DocID 
     ,ItemID 
     ,Item 
     ,0 as Rating 
     ,'' As Comment1 

    FROM [EPR].[dbo].[tblItems] 

    where SectionID = 1 and Active = 1 


    END 
-- if submitted (DocID exists), fill grid with evaluations items and rating 
ELSE 
    BEGIN 
    SELECT 
     d.eprid 
     ,d.DocID 
     ,i.[ItemID] 
     ,i.[Item] 
     ,d.Rating 
     ,c.Comment1 

    FROM [EPR].[dbo].[tblItems] i 

    join tblDetails d on i.ItemID = d.ItemID 
    join tblComments c on d.MYID = c.MYID 

    --Competence Section 
    where i.SectionID = 1 and i.Active = 1 and d.MYID = @myid 

    END 
END 

Antwort

0

Meine Lösung ist in meiner aktualisierten Frage enthalten. Mein Fehler scheint 2 Aktualisierungsabfragen in sqldatasource platziert zu haben. Ich entfernte eine Aktualisierungsabfrage und erstellte eine benutzerdefinierte Methode, um die SQL-Datenbank direkt zu aktualisieren, damit die Textbox sofort aktualisiert wurde, um die Textänderungs- und Radiobuttonliste sofort zu aktualisieren, wenn sie ausgewählt wurde. Ich habe gelesen, dass Sie 2 UPDATE-Abfragen mit sqldatasource haben können, wenn Sie jede Abfrage mit Semikolon trennen, aber das hat in meinem Fall nicht funktioniert.

0

Sie versuchen, die Datenbank zu aktualisieren und erhalten sofort den aktualisierten Wert, aber der C# -Code wartet nicht bis zum Ende der SQL-Operationen. Bitte lesen Sie diese:

How to requery updated values immediately after update procedure runs

Ich schlage vor, Sie separat geänderten Text Code zu aktualisieren.

//after all things done: 
theTextbox.Text = the_value_that_it_sended. 
+0

Danke @Farzin Kanzi, dass Sie sich die Zeit genommen haben, mich in die richtige Richtung zu weisen.Ich habe über das Wochenende LINQ gelesen - ich hatte es nie nötig, es vorher zu benutzen. Können Sie mir sagen, warum das Update auf die RadioButtonlist sofort in UI/Gridview beim Postback angezeigt wird, aber nicht bei Textbox, wenn der Code für beide Events fast identisch ist? Ich habe meine Frage aktualisiert, um die RadioButtonlist selectedindexchanged Event Code einzuschließen. – Doreen

+0

Jetzt bin ich verdächtig auf meine Antwort! Bitte sagen Sie mir, was das ist: 'Text = 'Sektion 1 Kommentare'' in der Textbox? –

+0

Lustig sollten Sie fragen, nur an seinem Morgen habe ich die Texteigenschaft in Text = 'geändert. <% # Bind ("Comment1")%> "Aber selbst auf page_Load füllt der Datenbankwert die Textbox nicht auf. Ich denke, das Problem ist mit den SQL-Abfragen. Die select-Anweisung zum Füllen des Gitters ist ein Join von 2 Tabellen und das Abfrageergebnis zeigt das Kommentarfeld nach jedem Element im Grid an, wenn es eine separate Spalte dafür gibt. Ich möchte nur, dass es einmal auftaucht, weshalb ich es in die Fußzeile lege, aber ich denke, das könnte der Grund sein, warum es sich schlecht benimmt. Ich frage mich, ob ich eine separate sqldatasource nur für die Textbox brauche? – Doreen

Verwandte Themen