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

Schreibe einen Kommentar