如何在突出显示当前行时使用箭头键在ASP.NET gridview中导航(向上或向下)?
我可以使用javascript代码和C#代码使用向上和向下箭头键移动行。我还实现了一个开始请求和结束请求JS代码,用于维护回发时的滚动位置。
但是,我的问题是,滚动条不会向上或向下移动以自动显示突出显示的行。假设有100行,我选择第15行,但网格高度就像它只能显示10行,除非我们手动移动滚动条,它不会自动移动以通过箭头键显示所选行。如何通过移动滚动条来确保突出显示的行的同步或可见性?
我的gridview没有复选框。
请帮帮我。我的代码在这里:
<asp:GridView ID="gvCycles" runat="server" AutoGenerateColumns="False"
CssClass="grid"
AllowSorting="True"
ShowHeader="False"
ShowFooter="True"
OnSelectedIndexChanged="gvDeductionList_SelectedIndexChanged"
OnRowDataBound="gvDeductionList_RowDataBound" DataKeyNames="CycleID" onselectedindexchanging="gvCycles_SelectedIndexChanging"
>
<Columns>
<asp:BoundField DataField="CycleID" HeaderText="CycleID"
HtmlEncode="False"
SortExpression="CycleID">
<ItemStyle CssClass="GridViewHiddenColumn" />
</asp:BoundField>
我在回发时保持滚动位置的做法是:
<script language="javascript" type="text/javascript">
// This Script is used to maintain Grid Scroll on Partial Postback
var scrollTop;
//Register Begin Request and End Request
Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler);
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
//Get The Div Scroll Position
function BeginRequestHandler(sender, args) {
var m = document.getElementById('divGrid');
scrollTop = m.scrollTop;
}
//Set The Div Scroll Position
function EndRequestHandler(sender, args) {
var m = document.getElementById('divGrid');
m.scrollTop = scrollTop;
}
</script>
另外,我在keydown和keyup中有这个
if (e.keyCode == '38') {
document.getElementById('<%= controlCapture.ClientID %>').value = false;
document.getElementById('<%= shiftCapture.ClientID %>').value = false;
// up arrow
__doPostBack(pageId, "up");
}
else if (e.keyCode == '40') {
document.getElementById('<%= controlCapture.ClientID %>').value = false;
document.getElementById('<%= shiftCapture.ClientID %>').value = false;
// down arrow
__doPostBack(pageId, "down");
问题:我不知道在代码项目中提到的代码在哪里使用,当我按下向下键或向上箭头键时,它应该自动移动滚动条。我没有分页。
Page_load代码
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) //on initial load, default dates to current fbt year
{
dpDateFrom.DateValue = currentBT;
dpDateTo.DateValue = currentBTEnd;
Searchclick();
}
//cursor keys
else if (Request.Form["__EVENTARGUMENT"] == "up" || Request.Form["__EVENTARGUMENT"] == "down")
{
string eventArgument = Request.Form["__EVENTARGUMENT"];
int intPayCycleId = 0;
if (gvCycles.SelectedIndex >= 0 && gvCycles.SelectedIndex < gvCycles.Rows.Count)
{
if (eventArgument == "down")
{
if (gvCycles.SelectedIndex < gvCycles.Rows.Count-1)
{
gvCycles.SelectedIndex += 1;
}
}
else if (eventArgument == "up")
{
if (gvCycles.SelectedIndex > 0)
{
gvCycles.SelectedIndex -= 1;
}
}
hdnSelectedRow.Value = gvCycles.SelectedValue.ToString() + ","; //assign hidden value with selected row
SetRowsStyle(gvCycles);
if (int.TryParse(gvCycles.SelectedRow.Cells[0].Text, out intCycleId))
{
ShowDeductions(intCycleId, false);
}
}
}
}
答案 0 :(得分:0)
看一下这个SO主题
而且,here's是一个很棒的示例代码
<强>更新强>
我刚看了一下代码here。如果使用DIV包装GridView,则自动滚动工作正常,如下所示。 (我使用this link中给出的相同代码,只添加了带有CSS样式的DIV。通过更改代码中的for
循环,增加了网格中显示的记录数量落后于n < 100
)
<div class="scrollable">
<asp:GridView ID="gridView" runat="server" AutoGenerateColumns="False" OnRowCreated="gridView_RowCreated"
TabIndex="0" GridLines="Horizontal">
<Columns>
<asp:BoundField HeaderText="S#" DataField="sno">
<HeaderStyle HorizontalAlign="Center" VerticalAlign="Middle" Width="50px" />
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" Width="50px" />
</asp:BoundField>
<asp:BoundField HeaderText="Random No" DataField="rndno">
<HeaderStyle HorizontalAlign="Center" VerticalAlign="Middle" Width="150px" />
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" Width="150px" />
</asp:BoundField>
<asp:BoundField HeaderText="Date" DataField="date">
<HeaderStyle HorizontalAlign="Center" VerticalAlign="Middle" Width="100px" />
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" Width="100px" />
</asp:BoundField>
<asp:BoundField HeaderText="Time" DataField="time">
<HeaderStyle HorizontalAlign="Center" VerticalAlign="Middle" Width="100px" />
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" Width="100px" />
</asp:BoundField>
</Columns>
<RowStyle BackColor="#FFE0C0" />
<HeaderStyle BackColor="#FF8000" Font-Bold="True" ForeColor="White" />
<AlternatingRowStyle BackColor="#FFC080" />
</asp:GridView>
</div>
而且,这是CSS
<style type="text/css">
.scrollable {
height: 460px;
width: 100%;
overflow: auto;
border: 0;
}
</style>
更新2
评论您的JavaScript代码(它有一个__doPostBack,它会进行回发并导致滚动条出现错误行为)
评论您else if
活动的Page_Load
部分,因为您评论了JS代码,我们将不会使用该部分
现在将以下代码添加到您的页面
<强>的JavaScript 强>
<script type="text/javascript">
var SelectedRow = null;
var SelectedRowIndex = null;
var UpperBound = null;
var LowerBound = null;
window.onload = function()
{
UpperBound = parseInt('<%= this.gvCycles.Rows.Count %>') - 1;
LowerBound = 0;
SelectedRowIndex = -1;
}
function SelectRow(CurrentRow, RowIndex)
{
if(SelectedRow == CurrentRow || RowIndex > UpperBound || RowIndex < LowerBound) return;
if(SelectedRow != null)
{
SelectedRow.style.backgroundColor = SelectedRow.originalBackgroundColor;
SelectedRow.style.color = SelectedRow.originalForeColor;
}
if(CurrentRow != null)
{
CurrentRow.originalBackgroundColor = CurrentRow.style.backgroundColor;
CurrentRow.originalForeColor = CurrentRow.style.color;
CurrentRow.style.backgroundColor = '#DCFC5C';
CurrentRow.style.color = 'Black';
}
SelectedRow = CurrentRow;
SelectedRowIndex = RowIndex;
setTimeout("SelectedRow.focus();",0);
}
function SelectSibling(e)
{
var e = e ? e : window.event;
var KeyCode = e.which ? e.which : e.keyCode;
if(KeyCode == 40)
SelectRow(SelectedRow.nextSibling, SelectedRowIndex + 1);
else if(KeyCode == 38)
SelectRow(SelectedRow.previousSibling, SelectedRowIndex - 1);
return false;
}
</script>
代码背后
protected void gvCycles_RowCreated(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow && (e.Row.RowState == DataControlRowState.Normal || e.Row.RowState == DataControlRowState.Alternate))
{
e.Row.TabIndex = -1;
e.Row.Attributes["onclick"] = string.Format("javascript:SelectRow(this, {0});", e.Row.RowIndex);
e.Row.Attributes["onkeydown"] = "javascript:return SelectSibling(event);";
e.Row.Attributes["onselectstart"] = "javascript:return false;";
}
}
希望这会有所帮助。