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

Вы также можете использовать метод compareTo() для сравнения двух строк. Если результат compareTo равен 0, то две строки равны, в противном случае сравниваемые строки не равны.

== сравнивает ссылки и не сравнивает фактические строки. Если вы создали каждую строку, используя new String(somestring).intern(), вы можете использовать оператор == для сравнения двух строк, в противном случае могут использоваться только методы equals () или compareTo.

7
задан Brian Genisio 1 September 2009 в 19:50
поделиться

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();
}
9
ответ дан 7 December 2019 в 01:24
поделиться

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

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

Просто включите разбиение на страницы для GridView, и все должно работать.

-1
ответ дан 7 December 2019 в 01:24
поделиться

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

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

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

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

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

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

    Узнайте, какая строка находится в
  • Теперь определите, какая страница должна быть выбрана, и какая строка на этой странице должна быть выбрана.
  • Установите CurrentPageIndex и привяжите сетку. теперь вы можете установить выбранный элемент
  • Теперь кикер здесь - шаги 1 и 2. если вы выполняете пейджинг данных на уровне SQL, вам нужно будет получить другой вызов хранимой процедуры / базы данных для определения «идентификатора строки» выбранного элемента. В противном случае, если вы загружаете коллекцию объектов или набор данных, вы можете пройти через цикл и найти элемент. Сохранение счетчика строк, если действительно необходимо.

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

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

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

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

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

    2
    ответ дан 7 December 2019 в 01:24
    поделиться

    Помимо уже указанных ответов об использовании Vector, Vector также имеет несколько методов для перечисления и извлечения элементов, которые отличаются от интерфейса List, и разработчиков (особенно тех, кто изучил Java до 1.2) могут использовать их, если они есть в коде. Хотя перечисления работают быстрее, они не проверяют, была ли коллекция изменена во время итерации, что может вызвать проблемы, и, учитывая, что вектор может быть выбран для ее синхронизации - с сопутствующим доступом из нескольких потоков, это делает эту проблему особенно опасной. Использование этих методов также связывает большой объем кода с Vector, так что заменить его другой реализацией List будет непросто.

    В Vector также есть множество методов для перечисления и извлечения элементов, которые отличаются от интерфейса List, и разработчики (особенно те, кто изучал Java до 1.2) могут использовать их, если они есть в коде. Хотя перечисления работают быстрее, они не проверяют, была ли коллекция изменена во время итерации, что может вызвать проблемы, и, учитывая, что вектор может быть выбран для ее синхронизации - с сопутствующим доступом из нескольких потоков, это делает эту проблему особенно опасной. Использование этих методов также связывает большой объем кода с Vector, так что будет нелегко заменить его другой реализацией List.

    В Vector также есть несколько методов для перечисления и извлечения элементов, которые отличаются от интерфейса List, и разработчики (особенно те, кто изучал Java до версии 1.2) могут использовать их, если они есть в коде. Хотя перечисления работают быстрее, они не проверяют, была ли коллекция изменена во время итерации, что может вызвать проблемы, и, учитывая, что вектор может быть выбран для ее синхронизации - с сопутствующим доступом из нескольких потоков, это делает эту проблему особенно опасной. Использование этих методов также связывает большой объем кода с Vector, так что будет нелегко заменить его другой реализацией List.

    t проверить, была ли коллекция изменена во время итерации, что может вызвать проблемы, и учитывая, что вектор может быть выбран для ее синхронизации - с сопутствующим доступом из нескольких потоков, это делает эту проблему особенно опасной. Использование этих методов также связывает большой объем кода с Vector, так что будет нелегко заменить его другой реализацией List.

    t проверить, была ли коллекция изменена во время итерации, что может вызвать проблемы, и учитывая, что вектор может быть выбран для ее синхронизации - с сопутствующим доступом из нескольких потоков, это делает эту проблему особенно опасной. Использование этих методов также связывает большой объем кода с Vector, так что будет нелегко заменить его другой реализацией List.

    Вы хотите, чтобы, если кто-то набирает 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: - Ошибка, если вы поместите идентификатор последней записи.

    РЕДАКТИРОВАТЬ: - Вот ссылка на Проект

    0
    ответ дан 7 December 2019 в 01:24
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: