none
如何控制GridView? RRS feed

  • 问题

  • 开发环境VS2005+MS SQL 2005,使用VB.ET语言
    以下代码希望实现在GridView中自动选择下一行的动作:
    If GridView1.SelectedIndex = GridView1.Rows.Count - 1 Then
      '当前选中行为当前页的最后一行
      If GridView1.PageIndex = GridView1.PageCount - 1 Then
        '当前页是最后一页则从第1页从新开始
        GridView1.PageIndex = 0
      Else
        '当前页不是最后一页则下翻一页
        GridView1.PageIndex = GridView1.PageIndex + 1
      End If
      '翻页后选中当前页第1行
      GridView1.SelectedIndex = 0
    Else
      '将选择行下移一行
      GridView1.SelectedIndex = GridView1.SelectedIndex + 1
    End If
    TextBoxId.Text = GridView1.SelectedRow.Cells(1).Text
    TextBoxName.Text = GridView1.SelectedRow.Cells(2).Text
    实际运行时,如果当前选中的是某页的最后一行,运行代码后,当前页已经翻了,但是TEXTBOXId显示的数据不是当前页的第一行,而是翻页前的页面的第一行。其它情况以下代码正常。
    2010年3月18日 10:22

答案

  • 如果不能在绑定的事件里去设置textbox的值,目前按照你的实现方法是无法解决了。

    因为你的方式涉及到:在翻页和数据绑定之前得到未绑定的gridview的某一个单元内的值。

    所以你可否换一种实现方式,不要从gridview中去获得,而直接从数据源着手。这样你的分页就不回影响取值了。

    这样你只要缓存数据,并且维持好行号就行了。


    Microsoft Online Community Support
    • 已标记为答案 123kaca 2010年3月24日 6:15
    2010年3月24日 5:42

全部回复

  • 你好,

    如果你有翻页,那可能存在你说的这种问题。

    翻页时需要重新获取数据重新绑定。但是这个过程是发生在你上面的代码执行后。

    因此此时GridView信息仍将保持不变,直到你翻页发生后才能生效。

    你可以在翻页的代码中设置textbox的值。

     


    Microsoft Online Community Support
    2010年3月22日 1:41
  • 首先谢谢你的回复!

    无论我在GridView1_PageIndexChanged()中还是在GridView1_PageIndexChanging()中设置TextBox的值,都存在以上问题。

    另外,我在代码中改变了GridView1.PageIndex,好像无法触发GridView1_PageIndexChanged()事件?

    2010年3月24日 3:03
  • 我的意思是说对于需要翻页的情况你能否在在翻页绑定的事件中去设置textbox的值。

    而不是在你上面的代码中设置。

    也就是说你上面代码用于处理一般的情况,也就是你说的现在正常的情况,非正常的情况(翻页)可以在重新绑定数据源的事件中做。

    不是要你在代码中改变PageIndex,你点击GridView上面的下页或者具体的页码的时候就会产生GridView_PageIndexChanged事件了。


    Microsoft Online Community Support
    2010年3月24日 3:19
  • 对不起,不能在翻页绑定的事件中去设置textbox的值:

    页面左边放置一个GridView,用于显示商品的编号和名称,供用户选择;

    页面的右边详细显示用户选择的商品的信息,并设置一个TextBox,让用户输入购买数量,

    然后单击按钮保存购买信息到数据库。

    希望实现:

    当用户保存当前商品的购买数量后,GridView自动选择下一个商品并显示在右边,让用户继续购买。当然,用户可以自己在GridView中选择某个商品。但是,绝大多数情况下,用户是每个商品都会选择并输入数量。这样,用户使用过程是:选择第一个商品->输入数量->单击保存按钮(程序自动选择下一个商品)->输入数量->单击保存按钮...直到完成全部商品选择。

    以上代码就是为了实现当用户保存后自动选择下一个商品,否则用户的使用过程是:选择第一个商品->输入数量->单击保存按钮->选择第下一个商品->输入数量->单击保存按钮->选择第下一个商品->输入数量->单击保存按钮...直到完成全部商品选择。

    2010年3月24日 3:52
  • 前台代码:

    <asp:GridView ID="GridView1" runat="server" AllowPaging="True" DataSourceID="ObjectDataSource1" SelectedIndex="0">
      <SelectedRowStyle BackColor="Yellow" />
      <Columns>
        <asp:CommandField ShowSelectButton="True" />
      </Columns>
    </asp:GridView>
    '此处简化页面右侧代码
    <asp:Label ID="Label1" runat="server" Text="编号"/><asp:TextBox ID="TextBox1" runat="server"/><br />
    <asp:Label ID="Label2" runat="server" Text="名称"/><asp:TextBox ID="TextBox2" runat="server"/><br />
    <asp:Label ID="Label3" runat="server" Text="数量"/><asp:TextBox ID="TextBox3" runat="server"/><br />
    <asp:Button ID="ButtonSave" runat="server" Text="Save" />

    后台代码:

    Protected Sub Buttonsave_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButtonSave.Click
      saveInformation() '保存购买信息
      If GridView1.SelectedIndex = GridView1.Rows.Count - 1 Then
        '当前选中行为当前页的最后一行
        If GridView1.PageIndex = GridView1.PageCount - 1 Then
          '当前页是最后一页则从第1页从新开始
          GridView1.PageIndex = 0
        Else
          '当前页不是最后一页则下翻一页
          GridView1.PageIndex = GridView1.PageIndex + 1
        End If
          '翻页后选中当前页第1行
          GridView1.SelectedIndex = 0
        Else
          '将选择行下移一行
          GridView1.SelectedIndex = GridView1.SelectedIndex + 1
        End If
        DisplayInformation() '显示商品详细信息
    End Sub
    2010年3月24日 3:59
  • 另外,我发现一个现象:

    设置GridView分页,每页10个记录。当选择第一页的第9个记录,翻页到第二页,在第二页记录少于9个时,再翻页到第一页,如果在GridView_PageIndexChanged事件中有以下代码就会出错:

    TextBox1.Text = GridView1.SelectedRow.Cells(1).Text

    这时,GridView虽然在第一页,但是GridView1.SelectedRow.Cells(1).Text却来自第二页的第9行,如果第二页只有8行,就出错了。

    2010年3月24日 4:23
  • 如果不能在绑定的事件里去设置textbox的值,目前按照你的实现方法是无法解决了。

    因为你的方式涉及到:在翻页和数据绑定之前得到未绑定的gridview的某一个单元内的值。

    所以你可否换一种实现方式,不要从gridview中去获得,而直接从数据源着手。这样你的分页就不回影响取值了。

    这样你只要缓存数据,并且维持好行号就行了。


    Microsoft Online Community Support
    • 已标记为答案 123kaca 2010年3月24日 6:15
    2010年3月24日 5:42
  • 谢谢KeFang Chen的提示,问题解决了:在代码中控制GridView翻页时,即GridView1.PageIndex = GridView1.PageIndex + 1
    时,有GridView_DataBound事件发生。而换行时,即GridView1.SelectedIndex = GridView1.SelectedIndex + 1
    时,不会发生GridView_DataBound事件,所以可以添加以下代码:

    Protected Sub GridView1_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridView1.DataBound
        DisplayInformation()
    End Sub
    就可以在发生翻页时也能够保证页面右侧的详细信息任然正确,即换行时通过ButtonSave_Click保证右侧信息的刷新,换页时通过GridView1_DataBound保证右侧信息的刷新。
    2010年3月24日 7:31