Возвращение объекта из моих строк GridView - PullRequest
10 голосов
/ 12 февраля 2009

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

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

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();
}

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

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

Я также связываю только некоторые свойства объекта Email с 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? Но тут есть много сложностей, которые входят в это ...

Ответы [ 4 ]

5 голосов
/ 12 февраля 2009

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

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

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

3 голосов
/ 13 февраля 2009

Что ж, я закончил циклом просмотра списка 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;
        }
        ...
    }
}

Я бы по-прежнему открыт для более эффективных решений.

0 голосов
/ 12 февраля 2009

Просто мысль, по сути, своя собственная, но не такая хитрая:

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

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

0 голосов
/ 12 февраля 2009

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

ViewState.Add("EmailObj", Email);

EMail email = (Email)ViewState["EmailObj"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...