Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.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
Javascript 仅显示用于在.Net 3.5的Gridview中插入新行的页脚_Javascript_Asp.net_Gridview_Rowdatabound_Emptydatatemplate - Fatal编程技术网

Javascript 仅显示用于在.Net 3.5的Gridview中插入新行的页脚

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

当我的Gridview与“几行”数据绑定时,我当前添加新行的方法是一种适当的设计,并且工作“良好”。但是,如果绑定了“多行”数据,我当前添加新行的方法是有缺陷的:我正在使用的EmptyDataTemplate是使用FooterTemplate公开的。因此,如果我有3行数据并单击“添加新记录”,网格将重新显示,其中第4行为数据输入“准备就绪”。然而,如果我有30行,那么要插入的行的显示是如此之低,它需要一个滚动条

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()