Zugriff auf versteckte Feld im gridview-Steuerelement, um einen Wert in javascript?
Ich habe ein gridview mit einer Reihe von template-Spalten. Eine dieser Spalten ist eine versteckte Spalte, die entweder den Wert 0 oder 1. Wenn eine Zeile in einem grid-Ansicht geändert habe ich den Wert auf 1, sonst lasse ich den Standardwert 0.
Des templatefield ist definiert als:
<asp:TemplateField>
<ItemTemplate>
<input type="hidden" id="rowIsChanged" runat="server" />
</ItemTemplate>
</asp:TemplateField>
Mein Problem ist (ohne zu viel details), ich habe ein Feld, wo rufe ich eine javascript-Funktion, und einige, die Validierung auf der client-Seite. In dieser Funktion möchte ich in der Lage sein, um Zugriff auf das versteckte Feld (rowIsChanged) für diese bestimmte Zeile und setzen Sie den Wert auf 1 (im javascript). So, wenn ich auf meine server Seite 'Update' - Taste kann ich sicherstellen, dass das update kommt, da ich eine Bedingung haben, checken für rowIsChanged==1
.
Also meine Frage, ich habe etwas zu diesem Effekt jetzt:
<asp:TemplateField>
<ItemTemplate>
<asp:TextBox id="txtMyDate" runat="server" onchange="DoSomeValidation(this)" />
</ItemTemplate>
<asp:TemplateField>
Und die javascript:
function DoSomeValidation(myParam)
{
//do some validation...
//here is where I need to access the hidden field 'rowIsChanged' and set the value to "1"
}
Also, wie kann ich Zugriff auf diese bestimmte Zeile rowIsChanged Feld und setzen Sie ihn auf "1".
Bearbeiten
Ist hier mehr details:
Asp-markup:
<asp:TemplateField HeaderText="Date" SortExpression="LineItemDate">
<ItemTemplate>
<ajaxToolkit:CalendarExtender TargetControlID="txtMyDate" ID="CalendarExtender3" runat="server"></ajaxToolkit:CalendarExtender>
<asp:TextBox ToolTip="Line Item Date" Width="60px" ID="txtMyDate" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.MyDate") %>'></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
Das Problem ist, wenn ich laden Sie zunächst die Seite, und laden Sie die raster-Daten, die das system übernimmt automatisch eine änderung vorgenommen wurde, das Datum (Wert des versteckten Feldes ist 1). Aber keine Veränderungen vorgenommen wurden, ist es nur eine anfängliche laden...Also ich weiß nicht, wie Sie damit umgehen können.
In der gridview-Zeile Datenbindung Fall, ich habe das folgende code-snippet:
If e.Row.RowType = DataControlRowType.DataRow Then
Dim hiddenField As HtmlInputHidden = DirectCast(e.Row.FindControl("rowIsChanged"), HtmlInputHidden)
Dim tLID As TextBox = CType(e.Row.FindControl("txtMyDate"), TextBox)
tLID.Attributes.Add("onchange", "document.getElementById('" + hiddenField.ClientID + "').value=1")
....
So, ich habe gepostet-code für das rowdatabound-Ereignis als auch das markup..aber sobald die Seite geladen wird mit KEINE änderungen getan werden, um das Feld txtMyDate
und ich auf den "Aktualisieren" - button auf meiner Seite, der etwas zu diesem Effekt:
For Each Row As GridViewRow In Me.gvLineItems.Rows
Dim hiddenField As HtmlInputHidden = DirectCast(Row.FindControl("rowIsChanged"), HtmlInputHidden)
'only update rows that have been edited /update IsDirty=1 :)
If (hiddenField.Value = "1") Then
Jede Zeile scheint, hat es den Wert 1, wenn die Zeile wurde bereits aktualisiert (onchange hab angerufen...). Aber dies ist nicht der Fall. Dies funktioniert gut für jedes andere Feld, das nicht mit dem Kalender-Steuerelement. Zum Beispiel, wenn ich kommentieren Sie die Zeile:
tLID.Attributes.Add("onchange", "document.getElementById('" + hiddenField.ClientID + "').value=1")
Und lassen Sie einfach die onchange-für alle anderen Felder und klicken Sie dann auf die Schaltfläche "Aktualisieren" funktioniert es wie erwartet (das ist, wenn ich ändern Sie den Wert in die Felder, dann das versteckte Feld hat den Wert 1, und wenn ich nicht ändern Sie die Werte in das Feld Sie haben den Wert 0). Aber das Problem ist nur dieses eine Feld...
Edit 2
Nur für Tests habe ich auch so probiert:
Protected Sub gvLineItems_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvLineItems.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
'this is used to add a trigger to the <TRIGGERS> tag for the update panel
'I could not do it in the HTML / ASP code because the button is inside of a gridview control
Dim hiddenField As HtmlInputHidden = DirectCast(e.Row.FindControl("hdnIsChanged"), HtmlInputHidden)
'the line item date
Dim tLID As TextBox = CType(e.Row.FindControl("txtMyDate"), TextBox)
'just a test...
tLID.Attributes("onchange") = "helloworld();"
Alles, was ich Tat, war fügen Sie eine js-Funktion aufgerufen helloworld (), die wie folgt aussieht:
function helloworld()
{
alert ("hello world");
}
Ich mein Projekt sofort und es meldet sich Hallo Welt (ich habe die 2 Zeilen im raster, so dass es Warnungen aus Hallo Welt zweimal). Dies ist ohne Veränderung, was auf die Daten, die Frage ist, warum ist onchange aufgerufen werden, ohne jede änderung? Es muss sein mit dem, wie es ist Einstellung das Datum, ab dem die Daten von der Datenbank zurückgegeben wird, ist, dass als ein onchange-Ereignis aus, wenn Sie markup sieht etwa so:
<asp:TextBox ToolTip="Line Item Date" ID="txtMyDate" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.MyDate") %>' />
Speziell die DataBinder.Eval(Container, "DataItem.MyDate")...
Edit #3..Könnte mögliche Ursache
@Tim
Habe ich beschlossen, eine kleine änderung machen, Sie erwähnten in Ihren Kommentaren, die Sie gefüllt in der txtMyDate statisch durch zuweisen eines Werts (eher dann ziehen Sie den Wert aus der Datenbank, wie ich es Tat). Also statt:
<asp:TextBox ToolTip="Line Item Date" ID="txtMyDate" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.MyDate") %>'
Nur für kichert ich es geändert:
<asp:TextBox ToolTip="Line Item Date" Width="60px" ID="txtMyDate" runat="server" Text="1/1/2011">
Ist habe ich den Wert statisch, wie Sie es...ich mein Projekt und jetzt die Warnung nicht Feuer, also auch keine onchange
dies ist wahrscheinlich der Grund, warum Sie nicht konnte den Fehler reproduzieren. So erscheint es dieser:
<asp:TextBox ToolTip="Line Item Date" ID="txtMyDate" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.MyDate") %>'
Ursachen der onchange
Ereignis ausgelöst, das ist für mich nicht gut :(...also Frage ist, wie man noch behandeln??
Bearbeiten 4!!!
Wow sorry für die edits, ich bin versucht, zu beseitigen Möglichkeiten hier...
So, jetzt, was ich Tat, war, entfernen Sie diese Zeile:
<ajaxToolkit:CalendarExtender TargetControlID="txtMyDate" ID="CalendarExtender3" runat="server"></ajaxToolkit:CalendarExtender>
Bedeutung, die ich entfernt die calendarextender aus dem markup und das onchange-Ereignis nicht mehr feuert auf das load-Ereignis. Warum wäre dies verursacht dies geschehen kann. Auch Wenn ich lassen Sie dieses:
<asp:TextBox ToolTip="Line Item Date" ID="txtMyDate" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.MyDate") %>'>
Solange ich beseitigen die calendarextender es funktioniert Prima...Habe ich schon erwähnt das gridview ist in einem updatepanel? Könnte dies das Problem sein?? Das problem ist, dass ich nicht wollen, entfernen Sie die calendarextender...ich möchte in der Lage sein, um Benutzern zu erlauben, wählen Sie ein Datum aus, eher dann Eingabe.
InformationsquelleAutor JonH | 2011-07-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fügen Sie die javascript-onchange-handler von codebehind:
C#
Bearbeiten: hier ist die js-Funktion, es funktioniert, um den Wert und Lesen Sie es nach dem postback:
Edit2: Hinzugefügt eine zusätzliche Prüfung auf einen Unterschied zwischen dem aktuellen Textfeld' Wert und es ist defaultValue.
Hinzugefügt wurde die js-Funktion. Ich habe es getestet, funktioniert.
Tim ich werde Sie wissen lassen, wenn das morgen klappt. Vielen Dank für die hand
Ich bin mit den gleichen Problem in der Vergangenheit...das Problem ist das Textfeld txtMyDate hat eine calendarextender zugeordnet. Und irgendwie, wenn ich zunächst füllen mein raster mit Werte (einschließlich der Werte von txtMyDate) es scheint so zu nennen, das onchange-Ereignis schon...also mein Problem ist das ich nicht gesetzt
hidden.value=1
hier richtig, da keine Veränderung war, die jemals gemacht sein, nur die Daten zu laden. Jetzt habe ich Angst ich weiß nicht, wie Sie damit umgehen?Sorry, ich kann nicht reproduzieren Sie das Problem. Ich habe ein CalendarExtender die ItemTemplate-direkt unterhalb der TextBox
txtMyDate
und das onchange-Ereignis wird nur gefeuert, wenn ich wählen Sie ein Datum aus CalendarExtender oder manuell(onblur). Ich habe den Text statisch auf geladen.InformationsquelleAutor Rango