2010-01-29 38 views
2

首先:如何添加項手動Repeater控件

  • _ddlOptions是下拉列表
  • _selectedOptions是中繼器控制

,這是我的最終控制的只是臨時代碼。

我想要做的是獲取_ddlOption的數據!IsPostBack。有Add按鈕,使用戶可以將選定的下拉項目移動到中繼器控制。

它以下面的方式更新Repeater.Items是否正確?我發現了許多使用DataSource手動添加/刪除元素的解決方案,但這裏我的DataSource是空的,因爲我只在!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中獲取所有未來的Pos​​tBack。

例子:

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 2010-01-29 15:54:42

0

我看不錯。你可能想要在onAdd方法之外移動列表的decalration。如你所知,我認爲每次單擊添加按鈕時它都會重新初始化,因此您的中繼器中永遠不會超過當前選定的項目。

相關問題