Внешний ключ в другом объекте - PullRequest
0 голосов
/ 16 июля 2011

У меня есть два класса:

public class Equipment
{
    public int EquipmentId { get; set; }
    public string Name { get; set; }
    public Nullable<int> EquipmentTypeId { get; set; }
}

public class EquipmentType
{
    public int EquipmentTypeId { get; set; }
    public string TypeName { get; set; }
}

Я возвращаю список оборудования из базы данных как List<Equipment>.

Затем я связываю его с Gridview через Gridview1.DataSource = equipmentList Это работает нормально, но мне нужно отобразить имя типа оборудования вместо ID. И в режиме редактирования мне нужно отобразить выпадающий список со всеми доступными EQuipmentTypeNames. Любое предложение о том, как это сделать? что такое архитектура?

Ответы [ 3 ]

1 голос
/ 16 июля 2011

Для отображения в GridView у вас есть несколько вариантов, от самых простых до самых сложных.

  1. Используйте вложенный SqlDataSource для типа оборудования и отображайте в отключенном раскрывающемся списке.
  2. Загрузите тип оборудования с оборудованием для привязки данных.
  3. Программно загрузите тип оборудования в событии RowDataBound.

Вот пример того, как вы можете включить данные типа оборудования:

var equips = GetEquipment();
var equipTypes = GetEquipmentTypes();

var data = from eq in equips
            join et in equipTypes on eq.EquipmentTypeId equals et.EquipmentTypeId
            select new { eq.EquipmentId, eq.Name, et.TypeName };

GridView.DataSource = data;

Для редактирования в GridView проще всего использовать DropDownList со своим собственным SqlDataSource (или пользовательским источником данных), который связан с Equipment.EquipmentTypeId, что-то вроде этого:

<EditItemTemplate>
    <asp:DropDownList ID="EquipmentTypeDropDown" runat="server"
        SelectedValue='<%#Bind("EquipmentTypeId") %>'
        DataSource='<%#GetEquipmentTypes() %>'
        DataTextField="TypeName" DataValueField="EquipmentTypeId">
    </asp:DropDownList>
</EditItemTemplate>

Где GetEquipmentTypes() - это просто метод, который возвращает List<EquipmentType>, который я использую для привязки данных.В этом случае, поскольку у меня нет базы данных, я просто генерирую данные в объекте-заглушке.Вы бы заменили этот метод своим классом BAL, который считывает данные из базы данных (или кода ADO.Net, или ObjectDataSource и т. Д.).

protected List<EquipmentType> GetEquipmentTypes()
{
    return new List<EquipmentType> {
        new EquipmentType { EquipmentTypeId = 1, TypeName = "Baseball" },
        new EquipmentType { EquipmentTypeId = 2, TypeName = "Football" },
        new EquipmentType { EquipmentTypeId = 3, TypeName = "Soccer" },
    };
}
1 голос
/ 16 июля 2011

Я бы порекомендовал расширить ваш класс Equipment с помощью дочернего класса (назовем его сейчас EquipmentEx) и добавил бы свойство EquipmentTypeName.Вместо того, чтобы ваш сохраненный процесс возвращал только столбцы Equipment, присоединитесь к таблице EquipmentType и включите дополнительный столбец имени типа.

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

Как только у вас есть объект EquipmentEx, вы получите ответ для отображения имени типа вместо ID -это уже часть объекта, так что вы можете отобразить его как обычно.

Если поместить раскрывающийся список в GridView, вы, вероятно, будете работать с тегом EditItemTemplate внутри поля шаблона, но я действительнонедостаточно работал с GridView, чтобы точно знать, как он будет выглядеть.Я всегда предпочитал обрабатывать подобные вещи чуть более вручную, чем доверять ASP.NET, чтобы сделать это для меня.Но так как значение вашего выпадающего списка будет представлять EquipmentTypeID, вы должны иметь возможность привязать это значение к объекту при его сохранении вместо значения TextBox.

0 голосов
/ 16 июля 2011

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

public class CompositeEquipment
{
    public int EquipmentId { get; set; }
    public string Name { get; set; }
    public string EquipmentTypeName { get; set; }
}

И если вы используете операторы SQL или хранимые процедуры, выможет написать следующее:

SELECT Equipment.EquipmentID,Equipment.Name,EquipmentType.TypeName FROM Equipment
INNER JOIN  EquipmentType ON Equipment.EquipmentTypeId = EquipmentType.EquipmentTypeId

и при чтении SqlDataReader сделайте следующее:

List<Equipment> lstEquipment = new List<Equipment>();
while(reader.read())
{
Equipment eq = new Equipment();
eq.reader["EquipmentId"];
eq.reader["Name"];
eq.reader["TypeName "];
lstEquipment.Add(eq);
}
Gridview1.DataSource = lstEquipment;

и если вы используете EntityFramework в качестве уровня доступа к данным, вы можете написать следующее:

using(YourOwnContext context = new YourOwnContext)
{
List<Equipment> lstEquipment = (from e in context.Equipments
                               select new Equipment
                               {
                                  EquipmentId = e.EquipmentId,
                                  Name = e.Name,
                                  TypeName = e.EquipmentType.TypeName
                               }}).ToList();
Gridview1.DataSource = lstEquipment;

Надеюсь, это поможет вам.

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