Возвращение объекта из моих строк GridView

В принципе, я хочу вернуть свой объект...

У меня есть объект электронной почты.

public class Email{
    public string emailAddress;
    public bool primary;
    public int contactPoint;
    public int databasePrimaryKey;

    public Email(){}
}

В моем usercontrol, я список объектов электронной почты.

public List<Email> EmailCollection;

И я привязываю это к GridView внутри моего usercontrol.

if(this.EmailCollection.Count > 0){
    this.GridView1.DataSource = EmailCollection;
    this.GridView1.DataBind();
}

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

Как мне это сделать?

Я также привязываю только некоторые свойства объектов электронной почты к GridView, и они помещаются в элементы шаблонов.

<Columns>

<asp:TemplateField HeaderText="Email Address">
    <ItemTemplate>
        <asp:TextBox ID="TextBox1" runat="server" Text=<%# Eval("EmailAddress") %> Width=250px />
    </ItemTemplate>
</asp:TemplateField>

<asp:TemplateField HeaderText="Primary">
    <ItemTemplate>
        <asp:CheckBox runat="server" Checked=<%# Eval("PrimaryEmail") %> />
    </ItemTemplate>
</asp:TemplateField>

<asp:TemplateField HeaderText="Contact Point">
    <ItemTemplate>
        <CRM:QualDropDown runat="server" Type=ContactPoint InitialValue=<%# Eval("ContactPoint") %> />
    </ItemTemplate>
</asp:TemplateField>

</Columns>

Может ли GridView сделать это? Нужно ли мне рулон моей собственной вещи? Было бы здорово, если бы это сделало это для меня.


Подробнее.

Я сохраняю коллекцию List в viewstate.

В чем я в конечном итоге попытаюсь добраться, появится кнопка "Сохранить" где-нибудь в элементе управления, который, когда срабатывает событие, я хотел бы создать объект электронной почты из datarow в GridView, который по сравнению с моим оригинальная коллекция списка. Тогда, если есть изменения, я бы обновил эту строку в базе данных. Я думал, что если бы я мог поместить коллекцию List в GridView, то, возможно, я смог бы получить ее обратно.

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

Ответ 1

Ну, я закончил цикл через свой список EmailCollection, который был сохранен в ViewState.

Итак, на странице нажата кнопка "Сохранить", когда событие поймано, я просматриваю свою коллекцию списков и захватываю строку из GridView по индексу.

В GridViewRow я должен использовать GridView1.Rows [i].Cells [j].FindControl( "myControl1" ), затем получить из него соответствующее значение, будь то флажок, текстовое поле или выпадающий список.

Я вижу, что объект GridViewRow имеет свойство DataItem, которое содержит мой объект электронной почты, но он доступен только во время фазы RowBound.

К сожалению, если/Когда мне нужно расширить эту коллекцию электронной почты позже, добавив или удалив столбцы, это займет несколько шагов.

protected void SaveButton_OnClick(object sender, EventArgs e){
    for (int i = 0; i < this.EmailCollection.Count; i++)
    {
        Email email = this.EmailCollection[i];
        GridViewRow row = this.GridView1.Rows[i];

        string gv_emailAddress = ((TextBox)row.Cells[0].FindControl("EmailAddress")).Text;
        if (email.EmailAddress != gv_emailAddress)
        {
            email.EmailAddress = gv_emailAddress;
            email.Updated = true;
        }
        ...
    }
}

Я все равно буду открыт для более эффективных решений.

Ответ 2

ASP.NET Databinding - это односторонняя операция с точки зрения манипулирования объектами. Однако свойство DataSource будет содержать ссылку на ваш EmailCollection во время ответа:

EmailCollection col = (EmailCollection)this.GridView1.DataSource;

Но я чувствую, что то, что вы действительно хотите, - это элемент управления, который управляет вашим EmailCollection на основе ввода пользователя и извлекает его в следующем запросе. Даже веб-формы не могут подделать такую ​​государственность из коробки.

Ответ 3

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

ViewState.Add("EmailObj", Email);

EMail email = (Email)ViewState["EmailObj"];

Ответ 4

Просто мысль, в основном сворачивайте ваши собственные, но не так сложно сделать:

Сохраните список, который вы используете в качестве источника данных в представлении или сеансе, и введите скрытое поле в gridview как индекс или ключ к объекту, который соответствует строке.

Другими словами, каждая строка в gridview "знает", какой объект электронной почты в списке, на котором он основан.