代码之家  ›  专栏  ›  技术社区  ›  Brian Genisio

ASP.Net中的GridView-选择正确的行

  •  7
  • Brian Genisio  · 技术社区  · 16 年前

    我还希望支持一个查询参数?ID=n,页面将在其中加载指定的项。

    我希望DataGrid转到正确的页面并选择项目,在FormView中显示指定的项目。

    除了将数据源限制在特定项之外,我不知道该如何做,这会让用户感到困惑。

    有什么想法吗?

    4 回复  |  直到 16 年前
        1
  •  9
  •   staterium    16 年前

    this CodeProject文章,介绍如何使用扩展方法基于记录的键值设置gridview的选定索引:

    public static void SetRowValueValueByKey(this GridView GridView, string DataKeyValue)
    {
        int intSelectedIndex = 0;
        int intPageIndex = 0;
        int intGridViewPages = GridView.PageCount;
    
        // Loop thru each page in the GridView
        for (int intPage = 0; intPage < intGridViewPages; intPage++)
        {
            // Set the current GridView page
            GridView.PageIndex = intPage;
            // Bind the GridView to the current page
            GridView.DataBind();
            // Loop thru each DataKey in the GridView
            for (int i = 0; i < GridView.DataKeys.Count; i++)
            {
                if (Convert.ToString(GridView.DataKeys[i].Value) == DataKeyValue)
                {
                    // If it is a match set the variables and exit
                    intSelectedIndex = i;
                    intPageIndex = intPage;
                    break;
                }
            }
        }
    
        // Set the GridView to the values found
        GridView.PageIndex = intPageIndex;
        GridView.SelectedIndex = intSelectedIndex;
        GridView.DataBind();
    }
    
        2
  •  2
  •   Mitchel Sellers    16 年前

    1. 从数据库获取数据以绑定到网格。
    2. 查找应显示的项目。找出它在哪一行
    3. 现在,确定应该选择哪一页,以及应该选择该页上的哪一行。
    4. 设置CurrentPageIndex并绑定网格。现在可以设置所选项目

    现在,这里的踢球者是第1步和第2步。如果在SQL级别对数据进行分页,则需要获得另一个存储过程/数据库调用,以确定所选项的“行id”。否则,如果要加载到对象集合或数据集,则可以循环查找该项。如果你真的必须的话,保持一个排队柜台。

    不优雅,但老实说,没有一种“优雅”的方式可以做到这一点。

        3
  •  0
  •   TheVillageIdiot    16 年前

    直接在浏览器和附录中显示页面的 ?id=x 为此,您应该引导他进入相关页面,选择相关行,并根据所选记录填充FormView。

    假设:- 数据键名 字段设置为源表的主键。获取的行按此键排序。我正在使用亚音速3与SQLServer2005ExpressDB交谈(巧合的是,这是我的第一个SS3项目,办公室里忙着尝试它)。

    Create Table StudentsTable
    ( EnrolmentNumber int not null identity primary key, 
      StudentName nvarchar(50) not null)
    

    <asp:GridView ID="gvStudents" runat="server" AllowPaging="True" PageSize="3"
     OnSelectedIndexChanged="GridRowChanged" OnPageIndexChanging="GridPageChanging" 
        DataKeyNames="EnrolmentNumber">
        <RowStyle BackColor="LightBlue" />
        <AlternatingRowStyle BackColor="LightCoral" />
        <Columns>
            <asp:TemplateField ShowHeader="False">
                <ItemTemplate>
                    <asp:LinkButton ID="LinkButton1" runat="server"  
                        CommandName="Select" Text="Select"></asp:LinkButton>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
        <SelectedRowStyle BackColor="Red" BorderColor="Yellow" />
    </asp:GridView>
    
    <asp:FormView ID="fvSubjects" runat="server" AllowPaging="false" 
        Caption="Student" CaptionAlign="Left">
        <ItemTemplate>
            <table>
                <tr>
                    <td>Enrolment Number</td>
                    <td><asp:Label ID="lblEN" runat="server" 
                         Text=<%# Eval("EnrolmentNumber") %> /></td>
                </tr>
                <tr>
                    <td>Student Name</td>
                    <td><asp:Label ID="lblName" runat="server" 
                         Text=<%# Eval("StudentName") %> /></td>
                </tr>
            </table>
        </ItemTemplate>
    </asp:FormView>
    

    C代码(忍住笑):

    private IList<StudentsTable> students;
    
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            LoadData();
                CheckQueryString(students);
        }
    }
    
    private void LoadData()
    {
        students = StudentsTable.All().ToList();
        gvStudents.DataSource = students;
        gvStudents.DataBind();
    }
    
    private void CheckQueryString(IList<StudentsTable> students)
    {
        if (!Request.QueryString.HasKeys() || 
           string.IsNullOrEmpty(Request.QueryString["erno"]))
        {
            return;
        }
    
        var erno = Request.QueryString["erno"];
        int key;
        if (!int.TryParse(erno, out key))
            return;
    
        for (var i = 0; i < students.Count; i++)
        {
            if (students[i].EnrolmentNumber == key)
            {
                SetPageSize(students, i);
    
                break;
            }
        }
    }
    
    private void SetPageSize(IList<StudentsTable> students, int i)
    {
        var ps = gvStudents.PageSize;
        var cp = i / ps;
        var ridx = i - ps - 1;
    
        var pageEvent = new GridViewPageEventArgs(cp);
        GridPageChanging(null, pageEvent);
        gvStudents.SelectedIndex = ridx;
        GridRowChanged(null, EventArgs.Empty);
    }
    
    protected void GridRowChanged(object sender, EventArgs e)
    {
        var rIdx = gvStudents.SelectedIndex;
        if (rIdx < 0) return;
    
        var key = gvStudents.DataKeys[rIdx];
        var lst= StudentsTable.Find(x => x.EnrolmentNumber == (int)key.Value);
        SetFormView(lst);
    }
    
    private void SetFormView(IList<StudentsTable> student)
    {
        fvSubjects.DataSource = student;
        fvSubjects.DataBind();
    }
    
    protected void GridPageChanging(object sender, GridViewPageEventArgs e)
    {
        var p = e.NewPageIndex;
        if (p > gvStudents.PageCount)
            p = gvStudents.PageCount - 1;
        gvStudents.PageIndex = p;
    
        LoadData();
    }
    

    PS:-如果您输入最后一条记录的id,则失败。

    编辑:-这里是链接到 Project

        4
  •  -1
  •   Ants    16 年前

    ASP.NET上的数据访问教程涉及您问题的各个方面。我已经有一段时间了,但我认为本教程的最后一部分可能最接近您的需要:

    http://www.asp.net/learn/data-access/tutorial-10-vb.aspx

    只要打开GridView的分页,一切都应该正常工作。

    推荐文章