Как я могу получить доступ к DataGridRow из текстового поля в этой строке? - PullRequest
0 голосов
/ 13 мая 2009

В 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 оценивается как ноль. Я ожидал, что он будет оцениваться как DataRowView?

Ответы [ 2 ]

1 голос
/ 13 мая 2009

Вы можете запустить событие 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 голосов
/ 23 июня 2010

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

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?
    }
}
...