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

时间:2009-08-31 01:26:39

标签: asp.net gridview

我有一个包含GridView的页面。 GridView一次分页有10个项目。通常,我希望用户从GridView中选择项目并填充FormView。这很有效。

我还想支持查询参数?ID = n,其中页面将加载指定的项目。

如何告诉DataGrid或数据源将哪个项目设置为数据上下文?

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

除了将数据源限制在特定项目之外,我无法弄清楚如何做到这一点,这会让用户感到困惑。

有什么想法?

4 个答案:

答案 0 :(得分:9)

如果将GridView的DataKey字段设置为包含主键,则有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();
}

答案 1 :(得分:2)

对此的正确解决方案会有所不同,具体取决于您实际从数据库中提取数据的方式。但这个过程几乎是一样的。

  1. 从数据库中获取数据以绑定到网格。
  2. 查找应显示的项目。找出它在
  3. 中的行
  4. 现在,确定应选择哪个页面,以及应该选择该页面上的哪一行。
  5. 设置CurrentPageIndex并绑定网格。现在您可以设置所选项目
  6. 现在,这里的踢球者是步骤1和2.如果您在SQL级别分页数据,则需要获取另一个存储过程/数据库调用以确定所选项目的“行ID”。否则,如果要加载到对象集合或数据集,则可以遍历并查找该项目。如果你真的必须保持一个行计数器。

    不优雅,但说实话,没有一种“优雅”的方式。

答案 2 :(得分:0)

@Brian如果我正确地理解了你的问题,那就意味着当网页显示时,用户点击一行就可以了解所有内容。如果某人直接在浏览器中键入页面,并将?id = x 添加到其中,您应该将其指向相关页面,选择相关行并填充FormView根据选定的记录。

如果是这种情况,我已经做了一些事情,但是让我提前警告它不是很优雅,它在凌晨2点30分,所以请不要笑。

假设: - 在提供的解决方案中, DataKeyNames 字段设置为源表的主键。提取的行按此键排序。我正在使用SubSonic 3与SQL Server 2005 Express DB进行通信(恰巧这是我的第一个SS3项目,非常忙于办公室试用它。)

表定义如下:

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

aspx:

<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

的链接

答案 3 :(得分:-1)

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

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

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