2009-05-13 7 views
0

Wenn sich Text in einem Textfeld ändert, möchte ich in einem DataGrid den Wert eines anderen Felds in dieser Zeile zu einem Array hinzufügen.Wie kann ich auf DataGridRow von einem Textfeld in dieser Zeile zugreifen?

public void txtTitle_TextChanged(object sender, EventArgs e) 
{ 
    TextBox titleBox = (TextBox)sender; 
    DataGridItem myItem = (DataGridItem)titleBox.Parent.Parent; 
    string test = DataBinder.Eval(myItem.DataItem, "prod_id").ToString(); 
} 

Allerdings wird myItem.DataItem als null ausgewertet. Ich habe erwartet, dass es als DataRowView auswertet?

Antwort

0

Effektiv löste ich dies, indem ich eine autonumber -Spalte zur Tabelle hinzufüge und den Wert davon verwendete, um das Positino der Reihe in der Tabelle zu bestimmen, dann den Wert davon verwendend, um die passende Reihe im Datagrid zu beeinflussen. Ich ändere jetzt nur die Farbe der Zeile, anstatt Werte in dieser Zeile zu einem Array hinzuzufügen, wie in der ursprünglichen Frage angegeben.

public void txtPrice_TextChanged(object sender, EventArgs e) 
{ 
    TextBox txtPrice = (TextBox)sender; 
    DataGridItem myItem = (DataGridItem)txtPrice.Parent.Parent; 
    markRows(myItem, true); 
} 

public void markRows(DataGridItem myItem, bool toSave) 
{ 
    // Prepeare to save this record? 
    CheckBox thisSave = (CheckBox)myItem.FindControl("chkSave"); 
    thisSave.Checked = toSave; 
    // Establish the row's position in the table 
    Label sNo = (Label)myItem.FindControl("SNo"); 
    int rowNum = Convert.ToInt32(sNo.Text) - 1; 
    CheckBox rowSave = (CheckBox)grid.Items[rowNum].FindControl("chkSave"); 

    // Update background color on the row to remove/add highlight 
    if (rowSave.Checked == true) 
     grid.Items[rowNum].BackColor = System.Drawing.Color.GreenYellow; 
    else 
    { 
     Color bgBlue = Color.FromArgb(212, 231, 247); 
     grid.Items[rowNum].BackColor = bgBlue; 
     // some code here to refresh data from table? 
    } 
} 
1

Sie können das Textchanged-Ereignis erhalten zu feuern, wenn Sie Folgendes tun:

<asp:DataGrid ID="DataGrid1" runat="server" AutoGenerateColumns="False" 
    onitemdatabound="DataGrid1_ItemDataBound"> 
    <Columns> 
     <asp:TemplateColumn HeaderText="Test"> 
      <ItemTemplate> 
       <asp:TextBox OnTextChanged="txtBox_TextChanged" ID="TextBox1" runat="server" AutoPostBack="True"></asp:TextBox> 
      </ItemTemplate> 
     </asp:TemplateColumn> 
     <asp:BoundColumn DataField="Name" HeaderText="Test 1"></asp:BoundColumn> 
    </Columns> 
</asp:DataGrid> 

Sie werden feststellen, dass ich die folgenden Eigenschaften festgelegt: Autopostback = „True“ ich auch habe manuell die OnTextChanged hinzugefügt = "txtBox_TextChanged" in das Textfeld.

In meinem Code hinter ich habe:

protected void txtBox_TextChanged(object sender, EventArgs e) 
{ 
    TextBox txtBox = (TextBox)sender; 
    Label1.Text = txtBox.Text; 
} 

Der einzige Weg, feuert das Ereignis ist, wenn Sie den Fokus auf dem Textfeld nach der Eingabe verlieren.

Wichtige Punkte zu beachten: Dies wird eine Post zurück, so Ajax könnte ein guter Weg, um die Benutzerfreundlichkeit nett zu halten. Sie müssen sicherstellen, dass Sie Ihre DataBind() in einem if (! IsPostBack)

wickeln Sie Hope dies hilft!

+0

Ich habe kein Problem, das Ereignis zu schießen, (es heißt genau so, wie Sie beschreiben). Mein Problem besteht darin, auf die Zeile zu verweisen, in der sich das Textfeld 'sender' befindet. – fearoffours

Verwandte Themen