Как найти TextBox в режиме редактирования GridViewRow

Я пробовал несколько так называемых ответов на это, и это меня потеряло. Я просто пытаюсь установить текстовое значение TextBox по умолчанию с сегодняшней датой и временем, но не могу найти элемент управления, когда нажимаю LinkButton с CommandName "Edit".

Вот мой вид сетки...

   <asp:GridView ID="gvSignInRegister" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" CellPadding="3" 
        DataSourceID="sdsSignInRegister" ForeColor="Black" BackColor="White" BorderColor="#999999" BorderStyle="Solid" BorderWidth="1px" GridLines="Vertical" OnRowCommand="gvSignInRegister_RowCommand1">
        <Columns>
            <asp:TemplateField HeaderText="Returned" SortExpression="DateTimeReturned">
                <EditItemTemplate>
                    <asp:TextBox ID="txtReturned" runat="server"></asp:TextBox>
                    <asp:ImageButton runat="Server" ID="calImg" ImageUrl="~/images/Calendar_scheduleHS.png" AlternateText="Click to show calendar" CausesValidation="False" />
                    <asp:RequiredFieldValidator ID="rfv1" runat="server" SetFocusOnError="true" ValidationGroup="vg1" ControlToValidate="txtReturned" ErrorMessage="Required"></asp:RequiredFieldValidator>
                    <ajaxToolkit:CalendarExtender ID="ce1" runat="server" PopupButtonID="calImg" Enabled="true" Format="dd/MM/yyyy" TargetControlID="txtReturned" PopupPosition="TopRight" OnClientDateSelectionChanged="AppendTime"></ajaxToolkit:CalendarExtender>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label9" runat="server" Text='<%# Eval("DateTimeReturned","{0:dd/MM/yyyy HH:mm}") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField ShowHeader="False">
                <EditItemTemplate>
                    <asp:Button ID="btnCAN" runat="server" CausesValidation="false" CommandName="Cancel" Text="CANCEL" />
                    <asp:Button ID="btnUPD" runat="server" ValidationGroup="vg1" CausesValidation="true" CommandName="Update" Text="UPDATE" />
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Button ID="btnEDT" runat="server" CausesValidation="false" CommandName="Edit" CommandArgument='<%# Container.DataItemIndex %>' Text="SIGN IN" />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
        <FooterStyle BackColor="#CCCCCC" />
        <PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" />
        <SelectedRowStyle BackColor="#000099" Font-Bold="True" ForeColor="White" />
        <HeaderStyle BackColor="Black" Font-Bold="True" ForeColor="White" />
        <AlternatingRowStyle BackColor="#CCCCCC" />
    </asp:GridView>

LinkButton btnEDT работает и переводит gridview в режим редактирования. Но в коде я не могу найти "txtReturned".

Это то, что я пробовал до сих пор...

protected void gvSignInRegister_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "Edit")
    {
        int rowIdx = Convert.ToInt32(e.CommandArgument);
        GridViewRow row = gvSignInRegister.Rows[rowIdx];
        if (row != null && row.RowType == DataControlRowType.DataRow)
        {
            TextBox tb = (TextBox)row.FindControl("txtReturned");
            if (tb != null) tb.Text = DateTime.Now.ToString("dd/MM/yyyy HH:mm");

            //I've tried this too but it does not work. Interestingly, it does not crash, so cells[4] must exist!
            //row.Cells[4].Text = DateTime.Now.ToString("dd/MM/yyyy HH:mm");
        }
    }
}

По какой-то причине rowIdx всегда равен 0. Почему? Я думал, что индекс строки 0 означает заголовок элемента управления gridview.

Я также пытался использовать NamingContainer, который большинство других людей предлагали в других сообщениях, но он возвращает пустой (я подозреваю, что новый?) GridViewRow.

ie

Строка GridViewRow = (GridViewRow)((GridViewRow)(e.CommandSource).NamingContainer);

ОБНОВЛЕНИЕ

Я нашел это, и это именно та проблема, с которой я столкнулся , но решение через RowEditing по-прежнему не находит текстовое поле!

Однако RowDataBound() решил эту проблему! Прочитайте мой ответ ниже.


person Fandango68    schedule 06.02.2016    source источник


Ответы (2)


Ответ заключался в том, чтобы войти в версию самого GridView в режиме редактирования, а затем найти элемент управления!

Согласно этот пост...

<asp:GridView ID="gvSignInRegister" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" CellPadding="3" 
            DataSourceID="sdsSignInRegister" ForeColor="Black" BackColor="White" BorderColor="#999999" BorderStyle="Solid" BorderWidth="1px" GridLines="Vertical" OnRowDataBound="gvSignInRegister_RowDataBound">
            <Columns> ...etc...


protected void gvSignInRegister_RowDataBound(object sender, GridViewRowEventArgs e)
                {
                    if (e.Row.RowType == DataControlRowType.DataRow)
                    {
                        if ((e.Row.RowState & DataControlRowState.Edit) > 0)
                        {
                            TextBox tb = (TextBox)e.Row.FindControl("txtReturned");
                            if (tb != null) tb.Text = DateTime.Now.ToString("dd/MM/yyyy HH:mm");
                        }
                    }
                }
person Fandango68    schedule 08.02.2016

Используйте Container.DisplayIndex вместо Container.DataItemIndex

Но я не думаю, что вы получите элемент управления textBox, если разместите его в EditItemTemplate.

Если вы ожидаете операцию редактирования, используйте приведенный ниже код.

HTML

<asp:GridView ID="gvSignInRegister" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" CellPadding="3"           ForeColor="Black" BackColor="White" BorderColor="#999999" BorderStyle="Solid" BorderWidth="1px" OnRowEditing="gvSignInRegister_RowEditing" OnRowCancelingEdit="gvSignInRegister_RowCancelingEdit"  OnRowUpdating ="gvSignInRegister_RowUpdating" GridLines="Vertical">
            <Columns>
                <asp:TemplateField HeaderText="Returned" SortExpression="DateTimeReturned">
                    <EditItemTemplate>
                        <asp:TextBox ID="txtReturned" Text='<%#Bind("DateTimeReturned", "{0:dd/MM/yyyy HH:mm}")%>'  runat="server"></asp:TextBox>
                        <asp:ImageButton runat="Server" ID="calImg" ImageUrl="~/images/Calendar_scheduleHS.png" AlternateText="Click to show calendar" CausesValidation="False" />
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label9" runat="server" Text='<%# Eval( "DateTimeReturned","{0:dd/MM/yyyy HH:mm}") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:CommandField ShowEditButton="true" />
            </Columns>
            <FooterStyle BackColor="#CCCCCC" />
            <PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" />
            <SelectedRowStyle BackColor="#000099" Font-Bold="True" ForeColor="White" />
            <HeaderStyle BackColor="Black" Font-Bold="True" ForeColor="White" />
            <AlternatingRowStyle BackColor="#CCCCCC" />

        </asp:GridView>

Код позади:

    protected void gvSignInRegister_RowEditing(object sender, GridViewEditEventArgs e)
    {
        gvSignInRegister.EditIndex = e.NewEditIndex;
        List<QuotationDetail> itemList = (List<QuotationDetail>)ViewState["ItemList"];
        gvSignInRegister.DataSource = itemList;
        gvSignInRegister.DataBind();
    }

    protected void gvSignInRegister_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    {

    }

    protected void gvSignInRegister_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        var txtQty = (TextBox)gvSignInRegister.Rows[e.RowIndex].FindControl("txtQuantity");
        decimal qty = 0;
        decimal.TryParse(txtQty.Text, out qty);

        if (qty < 0)
        {
            lblErrorSummary.InnerText = "Please provide valid Quantity";
            lblErrorSummary.Visible = true;
            return;
        }
        itemList[e.RowIndex].Quantity = qty
        ViewState["ItemList"] = itemList;
        gvSignInRegister.EditIndex = -1;
        gvSignInRegister.DataSource = itemList;
        gvSignInRegister.DataBind();
    }
person Rameshkan B    schedule 07.02.2016
comment
Спасибо, но я не запускаю обновление GV до тех пор, пока пользователь не укажет правильную дату/время, и я хочу, чтобы по умолчанию использовались сегодняшние дата и время, прежде чем они нажмут ОТПРАВИТЬ, чтобы запустить RowUpdating. Я только что попробовал использовать RowEditing, так как он находится в режиме редактирования, и да, вы правы. Я все еще не могу найти текстовое поле. Это почему? вы не можете найти элементы управления в режиме редактирования сетки? - person Fandango68; 08.02.2016
comment
Да, элементы управления в EditItemTemplate будут доступны только после активации режима редактирования. Таким образом, вы не можете получить его в событии rowediting. Вот почему я дал привязку к элементу управления текстовым полем. Это даст вам место для установки текущей даты при загрузке самой сетки. И вы можете выполнить валидацию в событии rowUpdating и вернуть false, если валидация не удалась. - person Rameshkan B; 08.02.2016