在DataGrid中,当文本框中的文本发生更改时,我想将该行中另一个字段的值添加到数组中。
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 :(得分: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 = “真” 我也手动将OnTextChanged =“txtBox_TextChanged”添加到文本框中。
在我的代码背后,我有:
protected void txtBox_TextChanged(object sender, EventArgs e)
{
TextBox txtBox = (TextBox)sender;
Label1.Text = txtBox.Text;
}
事件触发的唯一方法是在键入后失去对文本框的关注。
要考虑的要点: 这将导致回发,因此Ajax可能是保持用户体验良好的好方法。 您需要确保将DataBind()包装在if(!IsPostBack)
中希望这有帮助!
答案 1 :(得分:0)
实际上,我通过向表中添加一个autonumber列来解决这个问题,并使用this的值来确定表中行的positino,然后使用this的值来影响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?
}
}