GridView в ASP.Net -выбор правильной строки

У меня есть страница, которая включает в себя GridView. Этот GridView выгружается с 10 элементами одновременно. Обычно я хочу, чтобы пользователь выбрал элемент из GridView и заполнил FormView. Это хорошо работает.

Я также хочу поддержать параметр запроса ?ID=n, где страница будет загружать указанный элемент.

Как сообщить DataGrid или источнику данных, какой элемент установить в качестве контекста данных?

Я хочу, чтобы DataGrid перешел на нужную страницу и выбрал элемент, показывающий указанный элемент в FormView.

Я не могу понять, как это сделать, кроме ограничения источника данных конкретным элементом, что сбивает с толку пользователя.

какие мысли?

4 ответов


если поле DataKey GridView содержит первичный ключ, существует этой статья 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. поиск элемента, который должен отображаться. Узнайте, какая строка в
  3. теперь определите, какая страница должна быть выбрана и какая строка на этой странице должна быть выбрана.
  4. установите CurrentPageIndex и bind сетка. теперь вы можете установить выбранный элемент

теперь, Кикер здесь-Шаг 1 и 2. если вы подкачиваете данные на уровне SQL, вам нужно будет получить другую хранимую процедуру/вызов базы данных, чтобы определить "идентификатор строки" выбранного элемента. В противном случае при загрузке в коллекцию объектов или набор данных можно выполнить цикл и найти элемент. Учета счетчик строк, Если вы действительно должны.

не элегантный, но, честно говоря, нет "элегантного" способа сделать этот.


@Brian если я правильно понимаю ваш вопрос, Вы имеете в виду, что у вас все подключено, пользователь нажимает на строку, когда отображается страница. Вы хотите этого, если кто-то введите URL страницы непосредственно в браузере и добавляет ?id=x к нему вы должны направить его на соответствующую страницу, выбрать соответствующую строку и заполнить FormView на основе выбранной записи.

Ну, если это так, я сделал что-то, но позвольте мне предупредить перед рукой, что это не очень элегантный и его 2: 30 AM здесь, поэтому, пожалуйста, не смейтесь.

предположение:- в представленном решении то 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: - это не удается, если вы ставите идентификатор последней записи.

EDIT: - вот ссылка на проект


учебники по доступу к данным ASP.NET прикоснитесь к аспектам вашего вопроса. Это было некоторое время для меня, но я думаю, что последняя часть этого конкретного урока, возможно, ближе всего к тому, что вам нужно:

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

просто включите подкачку для GridView, и все должно просто работать.