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
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
Jetzt bin ich verdächtig auf meine Antwort! Bitte sagen Sie mir, was das ist: 'Text = 'Sektion 1 Kommentare'' in der Textbox? –
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