从GridView控件在ASP.Net奇怪的行为 [英] Strange behavior from GridView in ASP.Net

查看:136
本文介绍了从GridView控件在ASP.Net奇怪的行为的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

<一个href=\"http://stackoverflow.com/questions/35466067/how-to-$c$c-a-button-click-event-in-a-gridview-that-returns-a-value-from-its-row\">Follow从这个线程。

基本上,我有一个GridView用于显示数据库中的数据拉,页面也有一个过滤器按钮,这样以便选择只有工作人员点击列表中的工作人员在将改变SQL语句。

GridView控件每一行都有一个按钮,这在本质上出口AppointmentID如此可以显示更多信息的变量。

然而,一旦过滤器按钮pssed $ P $和 GridView控件内容改变了按钮 GridView控件不再是出口正确的ID。

标记的筛选按钮:

 &LT; D​​IV CLASS =下拉菜单&GT;
    &LT;按钮类=BTN BTN-主要下拉曲肘式=按钮数据切换=下拉ID =dropdownstaff&GT;&LT; ASP:标签=服务器ID =lblDropdownstaff文本= 所有的造型师&GT;&LT; / ASP:标签&gt;
        &LT;跨度类=插入符号&GT;&LT; / SPAN&GT;
    &LT; /按钮&GT;
    &LT; UL类=下拉菜单中选择ID =ulStaffSelect&GT;
        &LT;立GT;&LT; ASP:按钮=服务器文本=所有造型师ID =lstStaffSelect1/&GT;&LT; /李&GT;
        &LT;立GT;&LT; ASP:按钮=服务器文本=伊莲ID =lstStaffSelect2/&GT;&LT; /李&GT;
        &LT;立GT;&LT; ASP:按钮=服务器文本=曙光ID =lstStaffSelect3/&GT;&LT; /李&GT;
    &LT; / UL&GT;
&LT; / DIV&GT;

标记为GridView(注意注释掉LinkedButton - 它的行为同我正常的按钮,UseSubmitBehaviour设置为false一样):

 &LT; ASP:GridView控件ID =Staffgv=服务器的AutoGenerateColumns =false的AllowPaging =真每页=20OnPageIndexChanging =Staffgv_PageIndexChanging背景色= #f9f9f9的CssClass =gvStyleOnRowCommand =Staffgv_RowCommand&GT;
    &LT; HeaderStyle的CssClass =gvHeadStyle/&GT;
    &LT; PagerSettings模式=下一步previousFirstLastFirstPageText =&LT;&LT; previousPageText =&LT; NextPageText =&gt;中LastPageText =&GT;&gt;中/&GT;
    &LT; AlternatingRowStyle背景色=#FFFFFF的CssClass =gvAlternatingClass/&GT;
    &LT;柱体和GT;
        &LT; ASP:的TemplateField的HeaderText =开始InsertVisible =FALSESORTEX pression =DateTimeStart&GT;
            &LT; HeaderStyle宽度=70像素的CssClass =hdrGvStart/&GT;
            &LT;&ItemTemplate中GT;
                &LT; ASP:标签ID =lblDateTimeStart=服务器文本='&LT;%#绑定(DateTimeStart,{0:T】)%&GT;'&GT;&LT; / ASP:标签&gt;
            &LT; / ItemTemplate中&GT;
        &LT; / ASP:的TemplateField&GT;
        &LT; ASP:的TemplateField的HeaderText =完成SORTEX pression =DateTimeEnd&GT;
            &LT; HeaderStyle宽度=70像素的CssClass =hdrGvFinish/&GT;
            &LT;&ItemTemplate中GT;
                &LT; ASP:标签ID =lblDateTimeEnd=服务器文本='&LT;%#绑定(DateTimeEnd,{0:T】)%&GT;'&GT;&LT; / ASP:标签&gt;
            &LT; / ItemTemplate中&GT;
        &LT; / ASP:的TemplateField&GT;
        &LT; ASP:的TemplateField的HeaderText =用的名字SORTEX pression =用的名字&GT;
            &LT; HeaderStyle宽度=140px的CssClass =hdrGvForename/&GT;
            &LT;&ItemTemplate中GT;
                &LT; ASP:标签ID =lblForename=服务器文本='&LT;%#绑定(用名字)%&GT;'&GT;&LT; / ASP:标签&gt;
            &LT; / ItemTemplate中&GT;
        &LT; / ASP:的TemplateField&GT;
        &LT; ASP:的TemplateField的HeaderText =姓SORTEX pression =姓&GT;
            &LT; HeaderStyle宽度=140px的CssClass =hdrGvSurname/&GT;
            &LT;&ItemTemplate中GT;
                &LT; ASP:标签ID =lblSurname=服务器文本='&LT;%#绑定(姓)%&GT;'&GT;&LT; / ASP:标签&gt;
            &LT; / ItemTemplate中&GT;
        &LT; / ASP:的TemplateField&GT;
        &LT; ASP:的TemplateField&GT;
            &LT; HeaderStyle的CssClass =gvHeaderEdit/&GT;
            &LT;&ItemTemplate中GT;
                &LT; ASP:按钮的ID =Btnapptid=服务器文本=____的CssClass =btnGVEdit的CommandName =FillStaffTablesCommandArgument ='&LT;%#绑定(AppointmentID)%&GT;' UseSubmitBehavior =FALSE/&GT;
                &LT;% - &LT; ASP:LinkBut​​ton的ID =Btnapptid=服务器文本=____的CssClass =btnGVEdit的CommandName =FillStaffTablesCommandArgument ='&LT;%#绑定(AppointmentID)%&GT ;' WIDTH =48像素HEIGHT =48像素/&GT; - %GT;
            &LT; / ItemTemplate中&GT;
        &LT; / ASP:的TemplateField&GT;
    &LT; /专栏&GT;
&LT; / ASP:GridView的&GT;

和VB的code:

 昏暗CONNSTRING的String =数据源=(的LocalDB)\\ MSSQLLocalDB; AttachDbFilename =C:\\用户\\我\\文档\\ Visual Studio的2015年\\ Datebases \\ DB.mdf';集成安全=真;连接超时= 30保护小组的Page_Load(BYVAL发件人为对象,BYVAL E上System.EventArgs)把手Me.Load
    lblStaffHead.Text =您登录为&放大器; StaffMemberName
    selectedStaffMember =知音
    generatePage(selectedStaffMember)
结束小组保护小组lstStaffSelect1_Click(BYVAL发件人为对象,E作为EventArgs的)把手lstStaffSelect1.Click
    lblDropdownstaff.Text =所有造型师
    selectedStaffMember =知音    generatePage(selectedStaffMember)
结束小组保护小组lstStaffSelect2_Click(BYVAL发件人为对象,E作为EventArgs的)把手lstStaffSelect2.Click
    lblDropdownstaff.Text =伊莲
    selectedStaffMember =伊莲    generatePage(selectedStaffMember)
结束小组保护小组lstStaffSelect3_Click(BYVAL发件人为对象,E作为EventArgs的)把手lstStaffSelect3.Click
    lblDropdownstaff.Text =曙光
    selectedStaffMember =曙光    generatePage(selectedStaffMember)
结束小组功能findIndex(BYVAL selectedStaffMember作为字符串)
    选择案例selectedStaffMember
        案沙龙
            staffdropdownindex = 0
        案伊莲
            staffdropdownindex = 1
        案曙光
            staffdropdownindex = 2
        否则案例
            staffdropdownindex = 3
    结束选择
    staffindex = staffdropdownindex
    返回staffindex
结束功能保护小组generatePage(BYVAL selectedStaffMember作为字符串)
    staffindex = findIndex(selectedStaffMember)    昏暗sqlCommandString作为字符串
    如果staffindex&LT;&GT; 0,则        sqlCommandString =SELECT [约会] [DateTimeStart],[约会] [DateTimeEnd],[约会] [AppointmentID],[CustomerData] [用名字],[CustomerData] [姓]。。。与&amp;
                           FROM [约会]&放大器;
                           INNER JOIN [CustomerData]&放大器;
                           。ON [CustomerData] [客户] = [约会] [客户]&放大器;
                           WHE​​RE [任命] [HairdresserID] =&放大器; staffindex&安培;
                           ORDER BY [约会]。[DateTimeStart] ASC    elseif的staffindex = 0。然后
        sqlCommandString =SELECT [约会] [DateTimeStart],[约会] [DateTimeEnd],[约会] [AppointmentID],[CustomerData] [用名字],[CustomerData] [姓]。。。与&amp;
                           FROM [约会]&放大器;
                           INNER JOIN [CustomerData]&放大器;
                           。ON [CustomerData] [客户] = [约会] [客户]&放大器;
                           ORDER BY [约会]。[DateTimeStart] ASC    万一    ds_estrella.Clear()
    GridViewConnection(sqlCommandString)
结束小组保护小组GridViewConnection(BYVAL sqlCommandString作为字符串)
    Staffgv.DataSource =什么
    Staffgv.DataBind()    昏暗dbConn作为新的SqlConnection(CONNSTRING)    尝试
        dbConn.Open()        da_estrella =新SqlDataAdapter的(sqlCommandString,dbConn)
        da_estrella.Fill(ds_estrellaStaffView)        昏暗ICOUNT作为整数= ds_estrella.Tables(0).Rows.Count
        Staffgv.DataSource = ds_estrella        如果ds_estrella.Tables(0).Rows.Count&GT; 0,则
            Staffgv.DataSource = ds_estrella
            Staffgv.DataBind()
        其他
            Staffgv.DataSource = ds_estrella
            Staffgv.DataBind()
            昏暗的列数为整数= Staffgv.Rows(0).Cells.Count            没有在这种情况下找到的数据
        万一        dbConn.Close()
    抓住EX为例外
        lblDropdownstaff.Text =失败
    结束Try
结束小组保护小组Staffgv_PageIndexChanging(BYVAL发件人为对象,E作为GridViewPageEventArgs)处理Staffgv.PageIndexChanging
    Staffgv.PageIndex = e.NewPageIndex
结束小组保护小组Staffgv_RowCommand(BYVAL发件人为对象,E为GridViewCommandEventArgs)
    如果(e.CommandName =FillStaffTables)然后
        txtAppointmentID.Text = e.CommandArgument
    万一
结束小组


解决方案

它采取了一些工作,但我用你的code,建成了运行Web应用程序,所以我可以帮助调试此。你可能想要做的第一件事是添加以下行的第一行的的Page_Load

 如果Me.IsPostBack然后退出小组

这将使使你的整个的Page_Load 块只运行一次,从而使GridView控件不回头率到原来的状态。

例如,尝试点击伊莲按钮,然后单击GridView控件里面的____按钮。这将perviously导致整个GridView控件返回到原来的状态,但现在应该保持过滤gridview的present。

您可以移动上述 Me.IsPostBack 排队中/下你的的Page_Load ,只知道任何$下面的C $按c只运行的一次的:当第一次加载页面


你应该做的第二件事是添加另一行的Page_Load

  txtAppointmentID.Text =的String.Empty

应该放置的上方的的 Me.IsPostBack 行。当页面重新加载,使得所述被点击另一个按钮时,文本框未持有它previous /陈旧的价值这将清除出文本框。


最后,在你的的最顶端VB 文件,这是很好的做法,加上下面几行(如果你还没有的话)

 选项严格上
显式的选项在

这些选项会带出一些更多的错误,这些错误往往很容易解决的是,如果离开了,因为他们,他们有时会很微妙的错误/问题,是相当难以追查。这些选项一般会帮助人们更好地写出code。

Follow on from this thread.

Basically, I have a GridView which displays data pulled from a database, and the page also has a filter button such that clicking on a staff member on the list will change the SQL statement so that only that staff member is selected.

Within the GridView each row has a button which in essence exports the AppointmentID to a variable so further information can be shown.

However, once the filter button is pressed and the GridView contents changes the buttons in the GridView no longer 'exports' the correct ID.

Markup for the filter button:

<div class="dropdown"> 
    <button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown"  id="dropdownstaff"><asp:Label runat="server" ID="lblDropdownstaff" Text="All Stylists"></asp:Label>
        <span class="caret"></span>
    </button>
    <ul class="dropdown-menu" id="ulStaffSelect">
        <li><asp:Button runat="server" Text="All Stylists" ID="lstStaffSelect1"/></li>
        <li><asp:Button runat="server" Text="Elaine" ID="lstStaffSelect2"/></li>
        <li><asp:Button runat="server" Text="Dawn" ID="lstStaffSelect3"/></li>
    </ul>
</div>

Markup for the GridView (Note the commented out LinkedButton - It behaves the same as my normal button does with "UseSubmitBehaviour" set to false):

<asp:GridView ID="Staffgv" runat="server" AutoGenerateColumns="false" AllowPaging="true" PageSize="20" OnPageIndexChanging="Staffgv_PageIndexChanging" BackColor="#f9f9f9" CssClass="gvStyle" OnRowCommand="Staffgv_RowCommand">
    <HeaderStyle CssClass="gvHeadStyle" />
    <PagerSettings  Mode="NextPreviousFirstLast" FirstPageText="<<" PreviousPageText="<" NextPageText=">" LastPageText=">>" />
    <AlternatingRowStyle BackColor="#ffffff"  CssClass="gvAlternatingClass"/>
    <Columns>
        <asp:TemplateField HeaderText="Start" InsertVisible="False" SortExpression="DateTimeStart">
            <HeaderStyle Width="70px"   CssClass="hdrGvStart"/>
            <ItemTemplate>
                <asp:Label ID="lblDateTimeStart" runat="server" Text='<%# Bind("DateTimeStart", "{0:t}") %>'></asp:Label>
            </ItemTemplate>      
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Finish" SortExpression="DateTimeEnd">
            <HeaderStyle Width="70px"   CssClass="hdrGvFinish"/>
            <ItemTemplate>
                <asp:Label ID="lblDateTimeEnd" runat="server" Text='<%# Bind("DateTimeEnd", "{0:t}") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Forename" SortExpression="Forename">
            <HeaderStyle Width="140px"  CssClass="hdrGvForename"/>
            <ItemTemplate>
                <asp:Label ID="lblForename" runat="server" Text='<%# Bind("Forename") %>'></asp:Label>
            </ItemTemplate>               
        </asp:TemplateField>  
        <asp:TemplateField HeaderText="Surname" SortExpression="Surname">
            <HeaderStyle Width="140px"   CssClass="hdrGvSurname"/>
            <ItemTemplate>
                <asp:Label ID="lblSurname" runat="server" Text='<%# Bind("Surname") %>'></asp:Label>
            </ItemTemplate>               
        </asp:TemplateField>                                              
        <asp:TemplateField>
            <HeaderStyle CssClass="gvHeaderEdit" />
            <ItemTemplate>
                <asp:Button ID="Btnapptid" runat="server" Text="____"  CssClass="btnGVEdit" CommandName="FillStaffTables" CommandArgument='<%# Bind("AppointmentID") %>' UseSubmitBehavior="false"/>
                <%--<asp:LinkButton ID="Btnapptid" runat="server" Text="____"  CssClass="btnGVEdit" CommandName="FillStaffTables" CommandArgument='<%# Bind("AppointmentID") %>'  Width="48px" Height="48px"/>--%>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

And the VB code:

Dim connString As String = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename='C:\Users\me\Documents\Visual Studio 2015\Datebases\DB.mdf';Integrated Security=True;Connect Timeout=30"

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    lblStaffHead.Text = "You are logged in as " & StaffMemberName
    selectedStaffMember = "Salon"
    generatePage(selectedStaffMember)
End Sub

Protected Sub lstStaffSelect1_Click(ByVal sender As Object, e As EventArgs) Handles lstStaffSelect1.Click
    lblDropdownstaff.Text = "All Stylists"
    selectedStaffMember = "Salon"

    generatePage(selectedStaffMember)
End Sub

Protected Sub lstStaffSelect2_Click(ByVal sender As Object, e As EventArgs) Handles lstStaffSelect2.Click
    lblDropdownstaff.Text = "Elaine"
    selectedStaffMember = "Elaine"

    generatePage(selectedStaffMember)
End Sub

Protected Sub lstStaffSelect3_Click(ByVal sender As Object, e As EventArgs) Handles lstStaffSelect3.Click
    lblDropdownstaff.Text = "Dawn"
    selectedStaffMember = "Dawn"

    generatePage(selectedStaffMember)
End Sub

Function findIndex(ByVal selectedStaffMember As String)
    Select Case selectedStaffMember
        Case "Salon"
            staffdropdownindex = 0
        Case "Elaine"
            staffdropdownindex = 1
        Case "Dawn"
            staffdropdownindex = 2
        Case Else
            staffdropdownindex = 3
    End Select
    staffindex = staffdropdownindex
    Return staffindex
End Function

Protected Sub generatePage(ByVal selectedStaffMember As String)
    staffindex = findIndex(selectedStaffMember)

    Dim sqlCommandString As String
    If staffindex <> 0 Then

        sqlCommandString = "SELECT [Appointments].[DateTimeStart], [Appointments].[DateTimeEnd], [Appointments].[AppointmentID], [CustomerData].[Forename], [CustomerData].[Surname] " &
                           "FROM [Appointments] " &
                           "INNER JOIN [CustomerData] " &
                           "ON [CustomerData].[CustomerID] = [Appointments].[CustomerID] " &
                           "WHERE [Appointments].[HairdresserID] = " & staffindex &
                           "ORDER BY [Appointments].[DateTimeStart] ASC"

    ElseIf staffindex = 0 Then
        sqlCommandString = "SELECT [Appointments].[DateTimeStart], [Appointments].[DateTimeEnd], [Appointments].[AppointmentID], [CustomerData].[Forename], [CustomerData].[Surname] " &
                           "FROM [Appointments] " &
                           "INNER JOIN [CustomerData] " &
                           "ON [CustomerData].[CustomerID] = [Appointments].[CustomerID] " &
                           "ORDER BY [Appointments].[DateTimeStart] ASC"

    End If

    ds_estrella.Clear()
    GridViewConnection(sqlCommandString)
End Sub

Protected Sub GridViewConnection(ByVal sqlCommandString As String)
    Staffgv.DataSource = Nothing
    Staffgv.DataBind()

    Dim dbConn As New SqlConnection(connString)

    Try
        dbConn.Open()

        da_estrella = New SqlDataAdapter(sqlCommandString, dbConn)
        da_estrella.Fill(ds_estrella, "StaffView")

        Dim icount As Integer = ds_estrella.Tables(0).Rows.Count
        Staffgv.DataSource = ds_estrella

        If ds_estrella.Tables(0).Rows.Count > 0 Then
            Staffgv.DataSource = ds_estrella
            Staffgv.DataBind()
        Else
            Staffgv.DataSource = ds_estrella
            Staffgv.DataBind()
            Dim columncount As Integer = Staffgv.Rows(0).Cells.Count

            'No data found in this case
        End If

        dbConn.Close()
    Catch ex As Exception
        lblDropdownstaff.Text = "FAILED"
    End Try
End Sub

Protected Sub Staffgv_PageIndexChanging(ByVal sender As Object, e As GridViewPageEventArgs) Handles Staffgv.PageIndexChanging
    Staffgv.PageIndex = e.NewPageIndex
End Sub

Protected Sub Staffgv_RowCommand(ByVal sender As Object, e As GridViewCommandEventArgs)
    If (e.CommandName = "FillStaffTables") Then
        txtAppointmentID.Text = e.CommandArgument
    End If
End Sub  

解决方案

It took a bit of work, but I used your code and built a running web application so I can help debug this. The first thing you might want to do is add the following line as the first line inside your Page_Load

If Me.IsPostBack Then Exit Sub

This will make it so that your entire Page_Load block only runs once and so that the gridview doesn't keep returning to its original state.

For example, try clicking the "Elaine" button and then click the "____" button inside the gridview. This would perviously lead to the entire gridview returning to its original state, but now it should keep the filtered gridview present.

You may move the aforementioned Me.IsPostBack line up/down within your Page_Load, just know that any code below it will only run once: When the page first loads.


The second thing you should do is add another line in Page_Load

txtAppointmentID.Text = String.Empty

It should be placed above the Me.IsPostBack line. This will clear out the textbox when the page reloads so that said textbox doesn't hold a previous/stale value in it when another button is clicked.


Lastly, at the very top of your vb file, it's good practice to add the following lines (if you haven't already)

Option Strict On
Option Explicit On

These options will bring out a few more errors which are often very easy to fix yet, if left as they are, they can sometimes cause very subtle bugs/problems that are quite difficult to track down. These options will generally help one to write better code.

这篇关于从GridView控件在ASP.Net奇怪的行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆