如何手动将项添加到Repeater控件

时间:2010-01-29 15:44:34

标签: c# asp.net repeater

首先:

  • _ddlOptions是下拉列表
  • _selectedOptions是转发器控件

它只是我最终控制的临时代码。

我想要做的是获取_ddlOption的数据!IsPostBack。有一个添加按钮,用户可以将选定的下拉项目移动到转发器控件。

以下更新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();
    }

3 个答案:

答案 0 :(得分: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);
    }

我没有对此进行测试 - 这只是我的第一个想法,但你可以从这里开始构建它。

帕特里克。

答案 1 :(得分: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() 

答案 2 :(得分:0)

对我来说很好看。您可能只想在onAdd方法之外移动列表的decalration。正如您所拥有的那样,我认为每次点击添加按钮时都会重新初始化,因此您的转发器中的当前所选项目永远不会超过。