Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
DataBinding вложеных конролей в Repeaterе
|
|||
|---|---|---|---|
|
#18+
Добрый день, Я пишу свой конроль на основе стандартного 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 файл создается динамически, так что я не могу связать контроли из него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 19:25 |
|
||
|
|

start [/forum/topic.php?fid=18&fpage=924&tid=1391380]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
26ms |
get tp. blocked users: |
1ms |
| others: | 218ms |
| total: | 341ms |

| 0 / 0 |
