2009-08-31 2 views
7

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

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

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

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

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

Любые мысли?

+0

Вы используете DetailsView или управления FormView для отображения деталей выбранного элемента? – staterium

+0

Обратите внимание, что в первом абзаце вопроса я упоминаю, что я использую FormView для деталей. –

ответ

9

Если вы установите поле DataKey в GridView, чтобы содержать первичный ключ, есть this CodeProject статья о том, как установить выбранный индекс в GridView, основываясь на ключевом значении записи, используя метод расширения:

-1

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

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

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

+0

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

2

Правильное решение для этого будет немного отличаться в зависимости от того, как вы фактически извлекаете данные из базы данных. Но процесс практически такой же.

  1. Получите данные из своей базы данных, чтобы привязываться к сетке.
  2. Просмотрите элемент, который должен отображаться. Узнайте, в какой строке он находится
  3. Теперь определите, какая страница должна быть выбрана, и какую строку на этой странице следует выбрать.
  4. Установите CurrentPageIndex и привяжите сетку. теперь вы можете установить выделенный элемент

Теперь, если вы выполняете подкачку данных на уровне SQL, вам нужно будет получить еще один вызов хранимой процедуры/базы данных, чтобы определить " row id "выбранного элемента. В противном случае, если вы загружаете коллекцию объектов или набор данных, вы можете прокручивать и находить элемент. Держите счетчик строк, если вы действительно должны.

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

0

@Brian, если я правильно понимаю ваш вопрос, вы имеете в виду, что у вас есть все, что подключено. Пользователь нажимает на строку при показе страницы. Вы хотите, чтобы кто-то напечатал URL-адрес страницы непосредственно в браузере и добавил ? 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: - Это не удается, если вы помещаете идентификатор последней записи.

EDIT: - Вот ссылка на Project