我有一个问题,我可以第一次使用gridview进行分页,但是当我尝试点击第二页时,没有任何反应。我已经能够确定它与用于在我的gridview中触发OnTextChanged事件后用于标记到下一个文本框的JQuery脚本有关,该脚本就像魅力一样。首先,这是相关的代码:
<asp:ScriptManager ID="ScriptManagerDetails" runat="server" ScriptMode="Release"></asp:ScriptManager>
<script type="text/javascript">
var g_CurrentTextBox;
Sys.Application.add_load(applicationLoadHandler);
function applicationLoadHandler() {
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler);
}
function endRequestHandler() {
$get(g_CurrentTextBox).focus();
$get(g_CurrentTextBox).select();
}
function onTextFocus() {
g_CurrentTextBox = event.srcElement.id;
}
</script>
<asp:UpdatePanel ID="UpdatePanelDetails" runat="server">
<ContentTemplate>
<div class="row" id="ItemResults">
<asp:GridView ID="gvDetailList" runat="server" CssClass="table table-striped table-bordered table-hover"
AutoGenerateColumns="false" AllowPaging="true" OnPageIndexChanging="gvDetailList_PageIndexChanging" OnRowDataBound="gvDetailList_RowDataBound" Pagesize="25" >
<Columns>
<asp:BoundField DataField="ItemNumber" HeaderText ="Item Number" SortExpression="ItemNumber" />
<asp:TemplateField HeaderText="Qty" SortExpression="QUANTITY">
<ItemTemplate>
<asp:Label ID="lblGVQuantity" runat="server" Text='<%#Eval("QUANTITY") %>'></asp:Label>
<asp:Panel ID="pnlQuantity" runat="server">
<asp:TextBox ID="txtQuantity" runat="server" class="form-control input-sm"
AutoPostBack="true" Text='<%#Eval("QUANTITY") %>' OnTextChanged="txtQuantity_TextChanged"></asp:TextBox>
<asp:CompareValidator ID="cvQuantity" runat="server" ControlToValidate="txtQuantity" Type="Integer" ForeColor="Red"
Operator="DataTypeCheck" ErrorMessage="Quantity is not numeric" Text="* Quantity is not numeric" Display="Dynamic" ValidationGroup="valAdd" />
</asp:Panel>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<PagerStyle CssClass="pagination-ys" />
</asp:GridView>
<asp:SqlDataSource ID="SqlDetailList" runat="server"
ConnectionString="<%$ ConnectionStrings:MyConnectionStr%>"
>
</asp:SqlDataSource>
</div>
</ContentTemplate>
</asp:UpdatePanel>
这是背后的代码:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindDetails();
}
}
private void BindDetails()
{
string strSQL = "SELECT * FROM TABLE";
SqlDetailList.SelectCommand = strSQL;
gvDetailList.DataSource = SqlDetailList;
gvDetailList.DataBind();
}
protected void gvDetailList_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
gvDetailList.PageIndex = e.NewPageIndex;
BindDetails();
}
如果删除脚本,分页工作正常。但是我喜欢我说,留下的脚本,它只能在第一次工作,但不会在后续页面上工作。
答案 0 :(得分:0)
好的,我想我在做了一些改动后现在就开始工作了。首先,我通过查看当前Textbox是否为null以及gridview计数是否与页面请求之前相同来对JQuery脚本进行一些更改。这是因为出于某种原因,如果我在页面的第五行而下一页只有四行,那么它将把焦点放在页面的第五行,我会得到一个例外。 / p>
然后对于后面的代码,我只是将焦点放在Page_Load事件和PageIndexChanged事件的第一行(我添加了它)。
HTML:
<asp:ScriptManager ID="ScriptManagerDetails" runat="server" ScriptMode="Release"></asp:ScriptManager>
<script type="text/javascript">
var rowscountbefore;
var g_CurrentTextBox;
Sys.Application.add_load(applicationLoadHandler);
function applicationLoadHandler() {
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler);
}
function beginRequestHandler() {
rowscountbefore = $("#<%=gvDetailList.ClientID%> tr").length;
}
function endRequestHandler() {
if (g_CurrentTextBox != null && rowscountbefore == $("#<%=gvDetailList.ClientID%> tr").length) {
$get(g_CurrentTextBox).focus();
$get(g_CurrentTextBox).select();
}
}
function onTextFocus() {
g_CurrentTextBox = event.srcElement.id;
}
</script>
<asp:UpdatePanel ID="UpdatePanelDetails" runat="server">
<ContentTemplate>
<div class="row" id="ItemResults">
<asp:GridView ID="gvDetailList" runat="server" CssClass="table table-striped table-bordered table-hover" OnPageIndexChanged="gvDetailList_PageIndexChanged"
AutoGenerateColumns="false" AllowPaging="true" OnPageIndexChanging="gvDetailList_PageIndexChanging" OnRowDataBound="gvDetailList_RowDataBound" Pagesize="25" >
<Columns>
<asp:BoundField DataField="ItemNumber" HeaderText ="Item Number" SortExpression="ItemNumber" />
<asp:TemplateField HeaderText="Qty" SortExpression="QUANTITY">
<ItemTemplate>
<asp:Label ID="lblGVQuantity" runat="server" Text='<%#Eval("QUANTITY") %>'></asp:Label>
<asp:Panel ID="pnlQuantity" runat="server">
<asp:TextBox ID="txtQuantity" runat="server" class="form-control input-sm"
AutoPostBack="true" Text='<%#Eval("QUANTITY") %>' OnTextChanged="txtQuantity_TextChanged"></asp:TextBox>
<asp:CompareValidator ID="cvQuantity" runat="server" ControlToValidate="txtQuantity" Type="Integer" ForeColor="Red"
Operator="DataTypeCheck" ErrorMessage="Quantity is not numeric" Text="* Quantity is not numeric" Display="Dynamic" ValidationGroup="valAdd" />
</asp:Panel>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<PagerStyle CssClass="pagination-ys" />
</asp:GridView>
<asp:SqlDataSource ID="SqlDetailList" runat="server"
ConnectionString="<%$ ConnectionStrings:MyConnectionStr%>"
>
</asp:SqlDataSource>
</div>
</ContentTemplate>
</asp:UpdatePanel>
代码背后:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindDetails();
TextBox txtQuantity = (TextBox)gvDetailList.Rows[0].Cells[4].FindControl("txtQuantity");
txtQuantity.Focus();
}
}
private void BindDetails()
{
string strSQL = "SELECT * FROM TABLE";
SqlDetailList.SelectCommand = strSQL;
gvDetailList.DataSource = SqlDetailList;
gvDetailList.DataBind();
}
protected void gvDetailList_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
gvDetailList.PageIndex = e.NewPageIndex;
BindDetails();
}
protected void gvDetailList_PageIndexChanged(object sender, EventArgs e)
{
TextBox txtQuantity = (TextBox)gvDetailList.Rows[0].Cells[4].FindControl("txtQuantity");
txtQuantity.Focus();
}