powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / DataBinding вложеных конролей в Repeaterе
2 сообщений из 2, страница 1 из 1
DataBinding вложеных конролей в Repeaterе
    #33871358
Hobbbbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день,

Я пишу свой конроль на основе стандартного Repeaterа. Я хочу добавить в него возможность динамического создания DataSetа на основе тех контролей, которые пользователи поместили внутри ItemTemplate. Т.е. я хочу что бы мой контроль работал без внешнего источника информации (стандартный Repeater такого не умеет, к сожалению). Для этого я переписал метод OnPreRender и динамически создаю DataSet на который потом делаю DataBinding моего контроля. После этого я записываю DataSet в ViewState, таким образом мне не нужно его создавать каждый раз при перезагрузке страницы. Кроме того я добавил метод AddRow() который просто добавляет новую строку в DataSet, т.е. вместо одного ItemTemplate у меня после вызова этого метода получается уже два.
Это все работает без проблем. Проблемы начинаются тогда, когда я вношу какие-нибудь данные в один из контролей внутри ItemTemplate. Например изначально я пишу следующий код в aspx файле:
<questions:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<div>
<asp:TextBox ID="TextBox1" runat="Server" />
<asp:CheckBox ID="CheckBox1" runat="server" />
<asp:DropDownList ID="DropDownList1" runat="server" />
</div>
</ItemTemplate>
</questions:Repeater>
<asp:Button ID="AddNewRow" runat="server" Text="Add New Row" OnClick="Button1_Click" />

Все работает, и форма создается без проблем, однако, если я напишу что-нибудь в TextBoxе, а потом нажму на кнопку что бы добавить новую строчку, вся информация которую я только что ввел в TextBoxе потеряется, зато продублируется ItemTemplate.
Это происходит потому что я не знаю как связать вложеные контроли (TextBox1, CheckBox1, DropDownList1) с моим DataSetом.
Может кто нибудь может мне в этом помочь? Насколько я понимаю, мне это нужно делать из OnItemDataBound, но я все равно не знаю как.
Вот мой код:using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml;
using System.Xml.Serialization;
using System.Collections;
using System.Diagnostics;
using System.Web.UI.WebControls;
using System.Web.UI;
using System.Data;
using System.IO;
using System.Text;

namespace surveyBuilder.Survey.QuestionControls
{
public class Repeater : System.Web.UI.WebControls.Repeater, iQuestionItem, IPostBackDataHandler
{
private DataSet ds = new DataSet();

protected override void OnPreRender(EventArgs e)
{
ArrayList al = new ArrayList();
al.Add("1");
this.DataSource = al;
this.DataBind();
DataTable dt = new DataTable("dataSource");
if (ViewState["dataSource"] != null)
{
if (ds.Tables.Count == 0)
LoadDSFromViewState();
}
else
{
RepeaterItem ri = (RepeaterItem)this.Controls[0];
foreach (Object control in ri.Controls)
{
if (control.GetType() != typeof(System.Web.UI.LiteralControl))
{
WebControl currentControl = (WebControl)control;
DataColumn dc = new DataColumn(currentControl.ID, typeof(System.String));
dt.Columns.Add(dc);
}
}
DataRow dr = dt.NewRow();
foreach (DataColumn dc in dt.Columns)
dr[dc] = "";
dt.Rows.Add(dr);
ds.Tables.Add(dt);
//Bind each control to the column in the DataSet
SaveDSToViewState(ds);
}
this.DataSource = ds.Tables[0].DefaultView;
this.DataBind();
base.OnPreRender(e);
}
protected override void OnItemDataBound(RepeaterItemEventArgs e)
{
base.OnItemDataBound(e);
if (this.Controls.Count > 0)
{
RepeaterItem ri = (RepeaterItem)this.Controls[0];
foreach (Object control in ri.Controls)
{
if (control.GetType() != typeof(System.Web.UI.LiteralControl))
{
\\Вот тут надо что то вставить для связи вложеных конролей.
}
}
}
}

public void addRow()
{
if (ViewState["dataSource"] != null)
{
LoadDSFromViewState();
}
else
{
throw new Exception("Error connecting to the Data Source");
}
DataRow dr = ds.Tables[0].NewRow();
ds.Tables[0].Rows.Add(dr);
SaveDSToViewState(ds);
this.DataBind();
}

#region IPostBackDataHandler Members

public bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
{
throw new Exception("The method or operation is not implemented.");
}

public void RaisePostDataChangedEvent()
{
throw new Exception("The method or operation is not implemented.");
}

#endregion

private String UTF8ByteArrayToString(Byte[] characters)
{
UTF8Encoding encoding = new UTF8Encoding();
String constructedString = encoding.GetString(characters);
return (constructedString);
}
private Byte[] StringToUTF8ByteArray(String pXmlString)
{
UTF8Encoding encoding = new UTF8Encoding();
Byte[] byteArray = encoding.GetBytes(pXmlString);
return byteArray;
}
private void SaveDSToViewState(DataSet ds)
{
XmlSerializer ser = new XmlSerializer(typeof(DataSet));
MemoryStream s = new MemoryStream();
XmlTextWriter xtw = new XmlTextWriter(s, System.Text.Encoding.UTF8);
ser.Serialize(xtw, ds);
s = (MemoryStream)xtw.BaseStream;
ViewState["dataSource"] = UTF8ByteArrayToString(s.ToArray());
s.Close();
xtw.Close();
}
private void LoadDSFromViewState() {
XmlSerializer ser = new XmlSerializer(typeof(DataSet));
MemoryStream s = new MemoryStream(StringToUTF8ByteArray(ViewState["dataSource"].ToString()));
StreamWriter sw = new StreamWriter(s, System.Text.Encoding.UTF8);
ds = (DataSet)ser.Deserialize(s);
s.Close();
}
}

}

P.S. aspx файл создается динамически, так что я не могу связать контроли из него.
...
Рейтинг: 0 / 0
DataBinding вложеных конролей в Repeaterе
    #33874769
Hobbbbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Никаких советов?
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / DataBinding вложеных конролей в Repeaterе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]