【问题标题】:Is it possible to go to next and previous rows using Grid View?是否可以使用网格视图转到下一行和上一行?
【发布时间】:2015-03-24 19:23:33
【问题描述】:

如果我有两个名为 Next 和 Previous 的按钮,是否有办法在行之间导航并获取行数据。通过单击下一个按钮,我得到下一行数据并突出显示上一个按钮上的行和上一行数据。

我正在使用 ASP.NET 2.0 GridView

【问题讨论】:

  • 查看这篇文章,它可以给你一个实现你想要的提示:codedigest.com/Articles/ASPNET/…
  • 如果您使用 MVC,这个答案可能会有所帮助:stackoverflow.com/questions/11042556/…
  • 您是想通过更改其背景颜色来突出显示下一行/上一行,还是您真的想回传将所选行作为参数传递? “获取下一行数据”是指您想在某种形式上显示它吗?
  • @PrzemG 我想从行中获取数据,并且我的文本框很少,因此每行列数据都会进入文本框。我不只是想突出显示我想像按下下一个按钮一样导航它会转到下一行,如果有前一行,它将转到上一行。

标签: c# jquery asp.net


【解决方案1】:
int CurrentIndex = GridView1.SelectedIndex;
if (CurrentIndex != GridView1.Rows.Count - 1){
  int NextRowIndex = GridView1.Rows[GridView1.SelectedIndex + 1].RowIndex;
  GridView1.SelectedIndex = NextRowIndex;
  //get info
}

这样试试

【讨论】:

  • 我已经检查了您复制并粘贴代码的帖子,但它不起作用:)。
  • @MMK 这不应该是你的态度,他是想帮你。
  • @Legendary +1 为您解答。
  • @sharique ansari 这不是关于态度,而是关于赞扬已经回答过它的人。或者至少你可以放一些参考或链接。
  • 你是对的,但可能是他忘记添加参考了
【解决方案2】:

您可以仅使用 javascript 来实现它,速度非常快,因为每次更改行时页面都不会回发。

假设页面的简单版本:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="true">
</asp:GridView>
<asp:Button ID="btnPrevious" runat="server" Text="Prev" OnClientClick="changeSelectedRow(-1)" />
<asp:Button ID="btnNext" runat="server" Text="Next" OnClientClick="changeSelectedRow(1)" />
<br />
<br />
Sample form with 2 boxes:
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>

然后这个简单的 javascript 就可以完成工作了:

<script type="text/javascript">

    var selectedRow;

    $(document).ready(function () {
        var rows = $('#' + '<%= GridView1.ClientID %>').find('tr');
        // select first row by default
        rows.get(1).style.backgroundColor = '#0000AA';
        selectedRow = 1;
        document.getElementById('<%= TextBox1.ClientID %>').value = rows.get(selectedRow).childNodes[0].innerText;
        document.getElementById('<%= TextBox2.ClientID %>').value = rows.get(selectedRow).childNodes[1].innerText;
    });

    function changeSelectedRow(step) {
        var rows = $('#' + '<%= GridView1.ClientID %>').find('tr');

        var newSelectedRow = selectedRow + step;

        if (newSelectedRow > 0 && newSelectedRow < rows.length) {
            rows.get(selectedRow).style.backgroundColor = '#ffffff';
            rows.get(newSelectedRow).style.backgroundColor = '#0000aa';
            selectedRow = newSelectedRow;

            document.getElementById('<%= TextBox1.ClientID %>').value = rows.get(newSelectedRow).childNodes[0].innerText;
            document.getElementById('<%= TextBox2.ClientID %>').value = rows.get(newSelectedRow).childNodes[1].innerText;
        }

        // stop postback
        event.returnValue = false;
        return false;
    }
</script>

以上需要 jquery 才能工作。您可以将“className”设置为您的高亮/普通行类,而不是背景颜色。

【讨论】:

    【解决方案3】:

    你是如何绑定数据的? (对象 datsource、sql 数据源、数据源/数据绑定等)如果您想要用于绑定 gridview 的实际数据,则需要从数据源中获取。

    gv.Rows[row].Cells[col]
    

    将为您提供所选 gridview 行中显示的内容,但这将包括您的模板显示的任何内容,而不仅仅是数据。

    一种解决方案是将主键作为网格视图中选择按钮的命令参数传递,然后当您选择网格视图时,它会在数据表中搜索该记录,然后您可以在文本框等中显示该数据。

    将 select btn col 添加到 gridview:

    <asp:TemplateField>
        <ItemTemplate>
            <asp:Button runat="server" ID="btnSelect" Text="Select" CommandName="Select" CommandArgument='<%#Eval("Month")%>'/>
        </ItemTemplate>
    </asp:TemplateField>
    

    添加到网格视图:

    OnRowCommand="gvReport_OnRowCommand"
    

    文本框:

    <asp:TextBox runat="server" ID="txtPerson" />
    

    代码隐藏: 在此示例中,“月份”在我的数据中是唯一的,SessionDataTbl 是我用来绑定 gridview 的数据表。

    protected void gvReport_OnRowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Select")
        {
            //Find row data
            foreach (DataRow row in SessionDataTbl.Rows)
            {
                if (row["Month"].Equals(e.CommandArgument))
                {
                    txtPerson.Text = row["Person"].ToString();
                    //other text boxes, etc.
                    break;
                }
            }
            //Add row color change
            Button btn = e.CommandSource as Button;
            if (btn != null)
            {
                System.Web.UI.Control field = btn.Parent;
                if (field != null)
                {
                    GridViewRow row = field.Parent as GridViewRow;
                    if (row != null)
                    {
                        const string backColor = "background-color";
                        //Remove any previous backcolor
                        foreach (GridViewRow rw in gvReports.Rows)
                        {
                            rw.Style.Remove(backColor);
                        }
                        row.Style.Add(backColor, "yellow");
                    }
                }
            }
        }
    }
    

    此示例使用手动数据绑定,但这也可以使用对象数据源等来完成,但您必须在对象数据源 Selected 事件中捕获数据表(如果需要可以提供示例)

    注意:此示例必须启用 gridview 视图状态

    【讨论】:

      【解决方案4】:

      我会尝试这样的,

      //variables used
      int currentrow = 0;
      int maxrow = dataGridView1.Rows.Count-1;
      
      //on gridview fill
      for(int i=0;i<dataGridView1.Rows.Count;i++)
      {
      dataGridView1.Rows[i].Visible = false; 
      }
      currentrow=0;
      ataGridView1.Rows[0].Visible = true; 
      
      
      //button next
      if (currentrow < maxrow) 
      {
      dataGridView1.Rows[currentrow].Visible = false;
      currentrow++;
      dataGridView1.Rows[currentrow].Visible = true; 
      retrieveData();
      }
      
      //button previous
      if (currentrow > 0)
      {
      dataGridView1.Rows[currentrow].Visible = false;
      currentrow--;
      dataGridView1.Rows[currentrow].Visible = true;
      retrieveData();
      }
      
      //retrieveData(); would be calling the void 
      //that fills the textboxes with the dataGridView data;
      

      我认为这样的东西应该可以循环遍历行,我不能保证它不是全部输入 100% 正确,因为其中一些是在文本框中的 SO 上输入的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-10
        相关资源
        最近更新 更多