Возвращение объекта из моих строк 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 "знает", какой объект электронной почты в списке, на котором он основан.