【问题标题】:How to add item to Repeater control manually如何手动将项目添加到中继器控件
【发布时间】:2012-11-19 16:59:25
【问题描述】:

首先:

  • _ddlOptions 是下拉列表
  • _selectedOptions 是中继器控件

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

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

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

【问题讨论】:

    标签: c# asp.net repeater


    【解决方案1】:

    如果您只需要获取一次数据并且打算使用视图状态,请在第一次需要时获取数据,将其存储在 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);
        }
    

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

    帕特里克。

    【讨论】:

      【解决方案2】:

      我觉得不错。您可能只想将列表的声明移到 onAdd 方法之外。正如您所拥有的那样,我认为每次单击添加按钮时都会重新初始化它,因此您的中继器中永远不会超过当前选定的项目。

      【讨论】:

        【解决方案3】:

        您可以使用 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();  
        

        你也可以这样做,
        like rebind 取自: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() 
        

        【讨论】:

        • 嗯,我认为你错过了一点。我将只在 !IsPostBack 上获取一次数据,稍后我不会存储数据源。我正在使用 ViewState 机制,以便控件恢复其内容。
        猜你喜欢
        • 1970-01-01
        • 2018-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多