0

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 として評価されることを期待していましたか?

4

2 に答える 2

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) でラップしていることを確認する必要があります。

お役に立てれば!

于 2009-05-13T18:33:51.700 に答える
0

事実上、テーブルに自動番号列を追加し、この値を使用してテーブル内の行の位置を決定し、この値を使用してデータグリッド内の適切な行に影響を与えることで、これを解決しました。元の質問で述べたように、行の値を配列に追加するのではなく、行の色を変更するだけです。

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?
    }
}
于 2010-06-22T22:47:52.113 に答える