Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在从textchange事件回发后将焦点设置为当前gridview行中的特定文本框_C#_Asp.net_Gridview - Fatal编程技术网

C# 如何在从textchange事件回发后将焦点设置为当前gridview行中的特定文本框

C# 如何在从textchange事件回发后将焦点设置为当前gridview行中的特定文本框,c#,asp.net,gridview,C#,Asp.net,Gridview,在GridView中获得了一系列启用回发的文本框。当我在一个txtQuantity中键入一些文本并移动到一个txtnit文本框时,它会触发一个OnTextChanged事件并进行回发以计算一些总数。但是TxUnit控件失去了焦点,我必须用鼠标重新选择它。这样做有点烦人,有没有办法在回发过程中保持对这些控件的关注 ASPX页面: <asp:gridview ID="grdOrder" CssClass="table table-hover" GridLines="None"

在GridView中获得了一系列启用回发的文本框。当我在一个txtQuantity中键入一些文本并移动到一个txtnit文本框时,它会触发一个OnTextChanged事件并进行回发以计算一些总数。但是TxUnit控件失去了焦点,我必须用鼠标重新选择它。这样做有点烦人,有没有办法在回发过程中保持对这些控件的关注


ASPX页面:

<asp:gridview ID="grdOrder" CssClass="table table-hover" GridLines="None" 
            runat="server" ShowFooter="true" 
        AutoGenerateColumns="false"  ClientIDMode="Static"
        onrowdatabound="grdOrder_RowDataBound" HeaderStyle-CssClass="gridheader">

       <Columns>

        <asp:TemplateField HeaderText="Product">

            <ItemTemplate>

            <asp:Label ID="lblProductId" runat="server" Text='<%# Eval("INVENTORY_ITEM") %>' Visible = "false" />
                <asp:DropDownList ID="ddlProduct" runat="server" 
                    ClientIDMode="Static" class="form-control input-sm"
                     AutoPostBack="true" onselectedindexchanged="ddlProduct_SelectedIndexChanged">
                </asp:DropDownList>

            </ItemTemplate>

        </asp:TemplateField>

        <asp:TemplateField HeaderText="Qty">

            <ItemTemplate>

                <asp:TextBox ID="txtQuantity" runat="server" Text='<%#Eval("QUANTITY")%>'  class="form-control input-sm" Style=" text-align:right;"
                     ClientIDMode="Static" onkeypress = "return IsDecimal(this);" ontextchanged="txtQuantity_TextChanged" AutoPostBack="true"></asp:TextBox>

            </ItemTemplate>
]
        </asp:TemplateField>

        </asp:TemplateField>

        <asp:TemplateField HeaderText="Unit">

            <ItemTemplate>
                 <asp:TextBox ID="txtUnit" runat="server" class="form-control input-sm" AutoPostBack="true" Text='<%#Eval("UNIT_NAME")%>' 
                 ontextchanged="txtUnit_TextChanged" ClientIDMode="Static"></asp:TextBox>
            </ItemTemplate>

        </asp:TemplateField>

        </Columns>

</asp:gridview>
protected void txtQuantity_TextChanged(object sender, EventArgs e)
{               
    TextBox txtQuantity = (TextBox)sender;
    GridViewRow gridViewRow = (GridViewRow)txtQuantity.NamingContainer;
    DropDownList ddlProduct = (DropDownList)gridViewRow.FindControl("ddlProduct");
    Label lblGrossQuantity = (Label)gridViewRow.FindControl("lblGrossQuantity");
    TextBox txtUnit = (TextBox)gridViewRow.FindControl("txtUnit");

    //gridViewRow.Cells[3].FindControl("txtUnit").Focus();
    txtUnit.Focus();
}

问题是因为
PostBack
发生在您的
\u TextChanged
EventHandler之后。因此,您需要在那里捕获一些内容,并将其传递给
PreRender
。使用
Session
变量控制
PostBack
上的焦点,并在
Page\u PreRender()中访问它

或者,您可以使用javascript而不是Page\u PreRender

<body onload='setFocusToTextBox()'>

<script> 
    function setFocusToTextBox(){ 
         document.getElementById('<%= Session["event_control"] %>').focus();
    } 
</script>

函数setFocusToTextBox(){
document.getElementById(“”).focus();
} 
在设置焦点之前出现延迟的原因是文本框是默认焦点。如果你不想延迟,你可以创建一个隐藏的文本框,默认的焦点没有人看到,他们只会看到正确的文本框获得焦点。

这应该可以

protected void txtQuantity_TextChanged(object sender, EventArgs e)
{
    //Your working code
    GridViewRow myRow = ((Control)sender).Parent.Parent as GridViewRow;
    myRow.FindControl("txtUnit").Focus();
}

您可以将
TabIndex=“0”
指定给gridview中要首先聚焦的第一个文本框和回发后要自动移动光标的
TabIndex=“1”

改变

 <asp:TextBox ID="txtQuantity" runat="server" Text='<%#Eval("QUANTITY")%>'  class="form-control input-sm" Style=" text-align:right;"
                     ClientIDMode="Static" onkeypress = "return IsDecimal(this);" ontextchanged="txtQuantity_TextChanged" AutoPostBack="true"></asp:TextBox>

通过


改变

<asp:TextBox ID="txtUnit" runat="server" class="form-control input-sm" AutoPostBack="true" Text='<%#Eval("UNIT_NAME")%>' 
                 ontextchanged="txtUnit_TextChanged" ClientIDMode="Static"></asp:TextBox>

通过



您是否尝试过“myControl.Focus();”在你的处理程序结束时?是的,我在txtQuantity\u TextChanged event中做了,希望这能对你有所帮助!添加选项卡索引后,我没有得到任何差异。当我更改第二行中的数量时,在从txtQuantity回发后,焦点将设置为第一行中的txtnitName这是文本更改后发生的代码。回发发生在这之后,因此使此解决方案没有实际意义。请尝试使用一个.Parent而不是.Parent.Parent,我忘了提到这取决于您的目标框架版本问题只是设置焦点。例如,当我试图更改网格中第二行的txtQuantity时,Focus将设置为postbackSetFocus后第一行的txtnitName,只能在control.Focus()的PreRender异常之前和期间调用。当我更改第二行的quantity时,从txtQuantity回发后,焦点将设置为第一行的txtnitName如果查看源,行与行之间的文本框id是否唯一?尝试将其更改为
clientdmode
AutoID
而不是
Static
其工作正常。但最初焦点移到第一行,然后立即回到第二行,是吗?您是否尝试添加带有默认焦点的隐藏文本框,以便不看到延迟?我已经给出了3种不同的方法来满足您的请求,现在它只是实现了避免一些不需要的行为的最佳选择,而这些行为不是原始问题的一部分。
 <asp:TextBox ID="txtQuantity" runat="server" Text='<%#Eval("QUANTITY")%>'  class="form-control input-sm" Style=" text-align:right;"
                     ClientIDMode="Static" onkeypress = "return IsDecimal(this);" ontextchanged="txtQuantity_TextChanged" AutoPostBack="true" TabIndex="0"></asp:TextBox>
<asp:TextBox ID="txtUnit" runat="server" class="form-control input-sm" AutoPostBack="true" Text='<%#Eval("UNIT_NAME")%>' 
                 ontextchanged="txtUnit_TextChanged" ClientIDMode="Static"></asp:TextBox>
<asp:TextBox ID="txtUnit" runat="server" class="form-control input-sm" AutoPostBack="true" Text='<%#Eval("UNIT_NAME")%>' 
                 ontextchanged="txtUnit_TextChanged" ClientIDMode="Static" TabIndex="1"></asp:TextBox>