2010-01-29 5 views
2

Прежде всего:Как добавить элемент в Repeater управления вручную

  • _ddlOptions является выпадающий список
  • _selectedOptions является управление повторителем

и это просто временный код моего окончательного контроля.

Что я хочу сделать, это получить данные для _ddlOption on! IsPostBack. Существует кнопка «Добавить», которая позволяет пользователю перемещать выделенный раскрывающийся элемент в элемент управления ретранслятора.

Это следующий способ обновления Repeater.Items правильно? Я нашел много решений по добавлению/удалению элементов вручную с помощью DataSource, но здесь мой DataSource имеет значение NULL, поскольку я устанавливаю его только на! IsPostBack.

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      _ddlOptions.DataSource = new[] { 1, 2, 3 }; 
      _ddlOptions.DataBind(); 
     } 
    } 

    protected void OnAdd(object sender, EventArgs e) 
    { 
     var list = new ArrayList(_selectedOptions.Items); 
     list.Add(_ddlOptions.SelectedItem); 
     _ddlOptions.Items.RemoveAt(_ddlOptions.SelectedIndex); 
     _selectedOptions.DataSource = list; 
     _selectedOptions.DataBind(); 
    } 

ответ

5

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

Пример:

public List<int> Data 
    { 
     get 
     { 
      if (ViewState["Data"] == null) 
      { 
       // Get your data, save it and return it. 
       var data = new List<int> { 1, 2, 3 }; 
       ViewState["Data"] = data; 
       return data; 
      } 
       return (List<int>)ViewState["Data"]; 
     } 
     set 
     { 
      ViewState["Data"] = value; 
     } 
    } 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      BindData(Data); 
     } 
    } 

    private void BindData(List<int> data) 
    { 
     _ddlOptions.DataSource = data; 
     _ddlOptions.DataBind(); 
    } 

    protected void OnAdd(object sender, EventArgs e) 
    { 
     var existing = Data; 

     existing.Add(_ddlOptions.SelectedItem);       
     _ddlOptions.Items.RemoveAt(_ddlOptions.SelectedIndex); 

     Data = existing; 
     BindData(existing); 
    } 

Я не проверял это - и его только моя первая мысль, но вы можете построить на нем отсюда.

Patrick.

0

Вы можете использовать DataAdapter для заполнения таблицы в DataSet.

DataSet ds = new DataSet(); 

using (SqlConnection conn = YourConnectionFactory.GetConnection()) 
{ 
SqlCommand objComm = DBHelper.CreateStoredProc("YourStoredProcedure", 
conn); 
SqlDataAdapter adapt = new SqlDataAdapter(objComm); 
adapt.Fill(ds, TableName); 
conn.Close(); 
} 

DataTable dt = ds.Tables[0]; 
for (int a=dt.Rows.Count-1; a>= 0; a--) 
{ 
// check and insert as necessary 
} 

YourControl.DataSource = ds; 
YourControl.DataBind(); 

Вы также можете сделать что-то вроде этого, то,
как Пересвяжите Взято из: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.aspx:

Dim values As New ArrayList() 
    values.Add(New PositionData("Microsoft", "Msft"))  
values.Add(New PositionData("Intel", "Intc"))  
values.Add(New PositionData("Dell", "Dell")) 
Repeater1.DataSource = values Repeater1.DataBind() 
Repeater2.DataSource = values Repeater2.DataBind() 
+0

Хм, я думаю, что вам не хватает точки. Я собираюсь получать данные только один раз! IsPostBack, а позже я не буду хранить источник данных. Я использую механизм ViewState, чтобы элементы управления восстанавливали их содержимое. – dragonfly

0

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

Смежные вопросы