Удаление вставки Gridview с пользовательскими объектами в viewstate - PullRequest
2 голосов
/ 10 декабря 2010

Я хочу спроектировать вложенное сеточное представление с возможностью вставки, обновления, удаления с помощью пользовательских бизнес-объектов динамически внутри viewstate.

(Master Gridview)
EmployeeID  EmployeeName 
     1         Ted
            (Child Gridview)
                   ItemID       ItemName
                     1          Keyboard
                     2          Mouse  
     2         John
            (Child Gridview)
                    ItemID      ItemName
                      1          PSU  
                      2          GPU
                      3          Printer

В прошлом я делал это с помощью datatable / dataviews, но они - настоящий бред памяти.

  1. Как реализовать функциональность Master / Detail с бизнес-объектами?

  2. Что является альтернативой Dataview в основных деталях / бизнес-объектах.

Я знаю, это довольно широкий вопрос, но стоит кое-что начать =)

Ответы [ 2 ]

3 голосов
/ 17 декабря 2010

Честно говоря, GridViews не обеспечат вам значительного прироста производительности по сравнению с другими связанными с таблицами элементами управления ASP.NET.Если вы напишите иерархический объект следующим образом:

public class Employee
{
     [Constructors go here]

     public int EmployeeID { get; private set; }
     public string EmployeeName { get; private set; }

     public List<Child> Children { get; private set; } // Or Collection, Array, etc.
}

Вам все равно придется прослушивать событие RowDataBound, привести DataItem строки к вашему дочернему классу, а затем программно назначить егосвойства для GridViewRow.

Кроме того, у вас будет удовольствие создать TemplateField, в котором вы закроете текущие теги <td> и <tr> (или <div> или <span>, если вы чувствуете себя немного менее мазохистски), а затем вставьте еще один GridView в таблицу, которую уже сгенерировал GridView.

Обратите внимание, что мы не дошли до того места, где вы вставляетеудалите и обновите.

Честно говоря, если у вас есть время, попробуйте использовать AJAX (реальный материал, а не мусор AutoPostBack).ASP.NET WebMethods может возвращать HTML из элементов управления ASP.NET, вызывая .RenderControl(), и если вам абсолютно не нужно загружать всю сетку и все ее дочерние элементы одним махом и отображать все это для вашего пользователя, это будет более чемскорее всего, вы уменьшите время загрузки страницы и уменьшите нагрузку на ваш веб-сервер.

Если вы объедините это с jQuery, вызывать ASP.NET WebMethods легко.Как человек, который сделал это в обоих направлениях, я бы сказал, что метод jQuery / AJAX на самом деле проще, чем написание некоторого звукового оператора LINQ (или запроса ADO.NET), создание гигантского бизнес-объекта и попытка управлять всем этим в одномзагрузка страницы.

С другой стороны, если вы связаны и решили использовать для этого ASP.NET, я бы весьма предложил вам прочитать статьи MSDN на Событие RowEditing .Он детализирует некоторые тонкости правильной установки и получения EditIndex и разбивает его события на крошечные функции, которые абсолютно необходимы для чего-то подобного.В дополнение к тому, что вы видите там, я бы предложил вам сохранить вашу коллекцию бизнес-объектов в сеансе и изменить их в любом событии редактирования / создания / удаления строки, а затем повторно привязать ваш GridView.

Использованиеэтот метод, ваши пользователи в идеале должны были бы нажать кнопку отправки, чтобы фактически сохранить любые изменения.Это позволяет вам (и им) избежать сильной душевной боли, когда кто-то случайно удаляет элемент или обновляет его с недопустимым значением.

1 голос
/ 17 декабря 2010

Не уверен на 100% в этом вопросе, но, похоже, первое, что вы спрашиваете, - как определить отношение мастер / деталь в бизнес-объекте. В вашем примере работника с детьми у вас может быть такой объект:

      public class Employee
    {
              public int EmployeeId {get;set;}
              public string EmployeeName {get;set;}
              public List<Child> Children {get;set;}
    }

Затем, когда дело доходит до привязки к вашему основному виду сетки на каждом уровне, вы просто привязываете к нужной коллекции. Таким образом, уровень 1 будет привязан к List<Employee>, а затем уровень 2 будет привязан к Employee.Children, который будет List<Child>. Скорее всего, вы захотите связать уровень 2 во время события RowDataBound представления основной сетки

Альтернативой dataview для сложного объекта, такого как бизнес-объект, действительно является то, что вы делаете. Если вы хотите управлять только вставкой, обновлением, удалением в viewstate, тогда вы, вероятно, захотите использовать свои собственные средства для этого, поскольку готовые источники данных могут работать не так, как вы этого хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...