2009-05-13 4 views
0

В DataGrid, когда текст в текстовом поле изменяется, я хочу добавить значение другого поля в этой строке в массив.Как я могу получить доступ к DataGridRow из текстового поля в этой строке?

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(); 
} 

Однако myItem.DataItem оценивает как null. Я ожидал, что он будет оцениваться как DataRowView?

ответ

0

Фактически я решил это, добавив столбец автономера в таблицу и используя значение этого для определения позиции positino в таблице, а затем используя значение этого, чтобы повлиять на соответствующую строку в datagrid. Теперь я просто изменяю цвет строки, а не добавляю значения в эту строку к массиву, как указано в исходном вопросе.

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

Вы можете получить событие TextChanged стрелять, если вы сделаете следующее:

<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> 

Вы заметите, что у меня есть следующие свойства устанавливают: AutoPostBack = «True» Я также вручную добавил OnTextChanged = "txtBox_TextChanged" в текстовое поле.

В моем коде позади меня есть:

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

Единственный способ это событие будет срабатывать, когда вы теряете фокус на текстовом поле после ввода.

Ключевые моменты, которые необходимо учитывать: Это приведет к возврату сообщения, поэтому Ajax может быть хорошим способом сохранить приятный для пользователя интерфейс. Вам нужно будет убедиться, что вы обернули свой DataBind() в if (! IsPostBack)

Надеюсь, это поможет!

+0

У меня нет проблем с тем, чтобы событие загорелось (оно называется точно так, как вы описали). Моя проблема заключается в ссылке на строку, в которой находится текстовое поле 'sender'. – fearoffours