Javascript 仅显示用于在.Net 3.5的Gridview中插入新行的页脚
当我的Gridview与“几行”数据绑定时,我当前添加新行的方法是一种适当的设计,并且工作“良好”。但是,如果绑定了“多行”数据,我当前添加新行的方法是有缺陷的:我正在使用的EmptyDataTemplate是使用FooterTemplate公开的。因此,如果我有3行数据并单击“添加新记录”,网格将重新显示,其中第4行为数据输入“准备就绪”。然而,如果我有30行,那么要插入的行的显示是如此之低,它需要一个滚动条Javascript 仅显示用于在.Net 3.5的Gridview中插入新行的页脚,javascript,asp.net,gridview,rowdatabound,emptydatatemplate,Javascript,Asp.net,Gridview,Rowdatabound,Emptydatatemplate,当我的Gridview与“几行”数据绑定时,我当前添加新行的方法是一种适当的设计,并且工作“良好”。但是,如果绑定了“多行”数据,我当前添加新行的方法是有缺陷的:我正在使用的EmptyDataTemplate是使用FooterTemplate公开的。因此,如果我有3行数据并单击“添加新记录”,网格将重新显示,其中第4行为数据输入“准备就绪”。然而,如果我有30行,那么要插入的行的显示是如此之低,它需要一个滚动条 Protected Sub AddNewRecord(ByVal sender As
Protected Sub AddNewRecord(ByVal sender As Object, ByVal e As EventArgs)
GridView1.ShowFooter = True
'rebind data so GridView1_RowDataBound gets a chance to populate the footer
iSubscriberID = Session("SubscriberID")
LoadDataGrid(iSubscriberID)
End Sub
我希望能够改进添加新行的操作,但仍然使用页脚模板
是否有任何代码可以添加到我的GridView1\u RowDataBound处理程序中,以隐藏现有数据行,但仍然公开EmptyDataTemplate以通过FooterTemplate插入?我在那里尝试了一些东西,但没有成功。以下是该处理程序的现有代码:
Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs) _
Handles GridView1.RowDataBound
'-------------------------------------------------------------------------------------------*
' Handle 'Insert' requirements:
' - Bind dropdownlist controls with the possible incumbents and backups for some new position
'-------------------------------------------------------------------------------------------*
If e.Row.RowType = DataControlRowType.Footer Then
' Finding the Dropdown control.
Dim ctrl As Control = e.Row.FindControl("ddlUsers")
If ctrl IsNot Nothing Then
Dim dd As DropDownList = TryCast(ctrl, DropDownList)
dd.DataSource = allUsers
dd.DataBind()
End If
Dim ctrlB As Control = e.Row.FindControl("ddlUsersBackup")
If ctrlB IsNot Nothing Then
Dim ddB As DropDownList = TryCast(ctrlB, DropDownList)
ddB.DataSource = allUsers
ddB.DataBind()
End If
End If
End Sub
我对所有列使用TemplateField定义;下面是显示页脚模板的一部分的示例:
<asp:TemplateField HeaderText="Incumbent">
<ItemTemplate>
<asp:Label ID="lblUser" runat="server" Text='<%# Eval("Incumbent")%>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:Label ID="lblUser" runat="server" Text='<%# Eval("Incumbent")%>' Visible = "false"></asp:Label>
<asp:DropDownList Width="100%" runat="server"
id="ddlUsers" AutoPostBack="true"
DataTextField="FullName" DataValueField="UserID"
OnSelectedIndexChanged="ddlUsers_SelectedIndexChanged">
</asp:DropDownList>
</EditItemTemplate>
<FooterTemplate>
<asp:Label ID="lblUser" runat="server" Text='Set Incumbent'></asp:Label>
<br />
<asp:DropDownList Width="100%" runat="server"
id="ddlUsers" AutoPostBack="true"
DataTextField="FullName" DataValueField="UserID"
OnSelectedIndexChanged="ddlUsers_SelectedIndexChanged">
</asp:DropDownList>
</FooterTemplate>
</asp:TemplateField>
添加寻呼机以解决原始问题的方法开辟了一个新问题。对此有何想法?滚动gridview需要javascript,但如果您不想使用它,可能其他方法适合您的需要。如果在gridview中添加寻呼机并设置每页的少量项目,则添加新项目不会导致出现滚动条。然而,通过这种方法,我们还存在其他缺陷-新项目可能出现在新页面上,因此您应该强制网格显示最后一页,然后新行将始终可见:
Protected Sub GridView1_RowCommand(sender As Object, e As GridViewCommandEventArgs) _
Handles GridView1.RowCommand
' Insert data if the CommandName == "Insert"
' and the validation controls indicate valid data...
If e.CommandName = "Insert" AndAlso Page.IsValid Then
' Insert new record
GridView1DataSource.Insert()
' Indicate that the user needs to be sent to the last page
SendUserToLastPage = True
End If
End Sub
Protected Sub GridView1_DataBound(sender As Object, e As EventArgs) _
Handles GridView1.DataBound
' Send user to last page of data, if needed
If SendUserToLastPage Then
GridView1.PageIndex = GridView1.PageCount - 1
End If
End Sub
在这里,您可以找到此方法的完整示例:
编辑:2016年2月18日-数据源不支持服务器端数据分页错误
为了使用GridView服务器端分页,自定义集合必须实现ICollection接口。IEnumerable没有实现ICollection,这就是为什么会出现错误。有关在vb中实现的示例,您可以阅读以下内容:和:。之后,GridView将为您完成其余工作。总体思路:1.将GridView放置在固定高度的可滚动div中
2.在div下方放置单行表,其中包含插入新记录和“添加”按钮所需的所有控件
3.如果可能,请使用SqlDataSource填充GridView,并将insert命令包含到SqlDataSource中
4.在InsertParameters块中,使用asp:controlParameter绑定到新值。
5.添加代码以添加单击处理程序
mySqlDataSource.Insert()
PS:更好的是,将GridView重写为ListView(受.NET3.5支持)。这将给你更多的灵活性。例如,您可以将insert放在第一行。返回后,OP中的实际问题似乎可以归结为“如何保持用于插入的行可见”
Page
对象已经有一个名为Focus
的方法,可用于在页面呈现完成后使特定控件接收焦点
当浏览器可见区域之外的控件接收到焦点时,浏览器将滚动该控件到视图中,以便用户可以看到焦点
因此,要使插入行可见,请确保在代码中显示该行时,将焦点设置在该行中合适的控件上。看看这个So答案:谢谢Ron,但您提供的主题涉及win窗体和DataGridView(而不是我的案例,即web窗体和GridView控件)。您是否尝试在页脚中的适当控件上使用
Focus()
方法?据我所知,页面将滚动到该控件。。。看见我认为这将使用默认的页面
javascript
来设置焦点,但这可能是可以接受的..?根据我的测试,@user1429080建议将焦点设置在数据输入行的控件上,效果非常好。根据我的理解,您希望在单击“添加”按钮时保持滚动位置吗?所以,当你们点击按钮时,它不应该进入页面顶部,它只是停留在gridview的末尾,以便插入新记录。对吗?谢谢。我也读了斯科特·米切尔的整个教程。请参阅我的编辑:2016年2月18日关于这一演变成新问题的原始帖子。我相应地更新了我的答案。希望这能解决你的问题。谢谢你的建议。正如OP所说的,在gridview行数大于屏幕之前,该设计非常适合。我非常不愿意重写我的数据源构造函数(请参阅我对OP的最新编辑)并切换到ListView。你建议的要点几乎需要全部重写。
mySqlDataSource.Insert()