2012-03-29 20 views
0

Ich habe eine Verpflichtung, wo ich eine Textbox aktualisieren müssen, wenn eine der Wert in meinem Kurzansicht ändert .. ich eine Gridview mit 2 Reihen haben ..Gridview Ereignis Brennen nicht

ein ein Schablonenfeld mit Etikett und ein anderes Schablonenfeld mit einem Textfeld ...

meine Tabellenansicht sieht aus wie

    name     value 
        a      (empty textbox) 
        b      (empty textbox) 
        c      (empty textbox) 

jetzt, wenn der Benutzer einen Wert in teh Textfeld betritt sollte es automatisch ein anderes Textbox aktualisieren, die damit verbunden ist.

Hier meine Fragen ist, wenn jemand einen Wert in die Textbox eingibt, sollte ein Ereignis ausgelöst werden!

(Ich bekomme die Namen a, b, c, aus der Datenbank). Ich möchte keinen Link zum Bearbeiten oder Aktualisieren haben, da alle einzugebenden Werte obligatorisch sind!

ich versuchte Grid_SelectedIndexChanged1, aber das nicht feuern .. gibt es etwas, das ich vermisse oder ich muss ändern, damit der Evant gefeuert wird und ich die andere Textbox aktualisieren kann ??

Ich bin neu in ASP.NET also bitte helfen!

Vielen Dank im Voraus!

+2

TextBox hat eine AutoPostback -Eigenschaft setzen Sie es auf True und behandeln das TextChanged-Ereignis oder tun es auf der Clientseite mit Javascript. –

+0

Würdest du mir bitte sagen, was du meinst, wenn du Textboxen verknüpfst? –

+0

Ich habe das auch versucht .. aber wie kann ich wissen, welche Zeilen Textfeld geändert? – helpme

Antwort

1

Sie können Überprüfen Sie den aktuellen Zeilenindex wie unten ...

((GridViewRow)((TextBox)sender).NamingContainer).RowIndex 

einen Handler für OnTextChanged Ereignis erstellen und AutoPostBack Property True gesetzt.

+0

@pankaj ... Ich habe versucht, es zu tun, wenn ich das tue und versuche, auf die Zelle zuzugreifen, die eine leere Zeichenfolge zurückgibt! – helpme

+0

Ich habe eine Sache wie GridViewRow gv = Grid.Rows [CurrentGridIndex]; Zeichenfolge Wert = gv.Cells [0] .Text; – helpme

+1

Sie finden die Steuerelemente in Ihren Zellen wie '(ControlType) gv.FindControl (" YourID ")' – Pankaj

2

Wenn die Aktualisierungen ausgelöst werden sollen, wenn sich der Text ändert, sollten Sie das Ereignis OnTextChanged von TextBox verwenden und AutoPostBack auf true setzen.

EDIT

zu vermeiden Bemühungen hier zu duplizieren, den oben beschriebenen Ansatz verwenden, können Sie den Zeilenindex mit der Technik finden, die Pankaj Garg in seiner Antwort vor:

int rowIndex = ((GridViewRow)((TextBox)sender).NamingContainer).RowIndex; 

Der größte Nachteil Dieser Ansatz besteht darin, dass Änderungen der Markups nicht verzeiht werden. Wenn Sie die TextBox in ein anderes Steuerelement wälzen, das INamingContainer implementiert, würde das obige Beispiel brechen. Zum Beispiel:

<asp:TemplateField> 
    <asp:Panel ID="Panel1" runat="server"> <!-- becomes the naming container --> 
     <asp:TextBox ID="TextBox1" runat="server" onchange='valueChanged(<%# Container.ItemIndex %>);' /> 
    </asp:Panel> 
</asp:TemplateField> 

aber sagen, dass würden Sie Ihr Markup entsprechend notieren, damit andere Entwickler wissen, vorsichtig zu sein, wenn Sie Änderungen vornehmen.

EDIT

Als Alternative können Sie auch das Postbacks in JavaScript lösen die onchange Ereignis des TextBox mit:

<script type="text/javascript"> 
    valueChanged = function(rowIndex){ 
     __doPostBack("<%= GridView1.ClientID %>", rowIndex); 
    } 
</script> 
<asp:GridView ID="GridView1" runat="server" DataKeyNames="ID" ...> 
    <Columns> 
     <asp:TemplateField> 
      <asp:TextBox ID="TextBox1" runat="server" onchange='valueChanged(<%# Container.ItemIndex %>);' /> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView>  

Im Code-behind, überschreiben die RaisePostBackEvent Methode und Stellen Sie Ihre Update-Logik dort:

protected override void RaisePostBackEvent(IPostBackEventHandler source, string eventArgument) 
{ 
    base.RaisePostBackEvent(source, eventArgument); 

    if (source == GridView1) 
    { 
     int rowIndex = int.Parse(eventArgument); 

     TextBox txt = GridView1.Rows[rowIndex].FindControl("TextBox1") as TextBox; 
     if (txt != null) 
     { 
      var id = (int)GridView1.DataKeys[rowIndex]["ID"]; 
      var text = txt.Text.Trim(); 

      //update the database 
     } 
    }  
} 
+0

Wenn sich GridView in einem UpdatePanel befindet (nur Raten), muss er auch einen Trigger für den RowCommand der GridView hinzufügen. –

+0

@ danke für die Antwort, das Problem ist, ich habe wissen, welchen Wert der Textbox ich jetzt habe .. zum Beispiel muss ich wissen .. der Wert von a = der Wert eingegeben! – helpme

+0

Ich bin mir nicht sicher, was du meinst. Willst du sagen, dass du wissen musst, welcher Reihe die 'TextBox' entspricht? –

Verwandte Themen