如何从该行的文本框中访问DataGridRow?

时间:2009-05-13 10:45:24

标签: c# .net datagrid datarowview

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

2 个答案:

答案 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?
    }
}