首先:
> _ddlOptions是下拉列表
> _selectedOptions是转发器控件
这只是我最终控制权的临时代码.
我想要做的是在!IsPostBack上获取_ddlOption的数据.有添加按钮,使用户可以将选定的下拉项移动到中继器控件.
它通过以下方式更新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();
}
解决方法:
如果您只需要获取一次数据,并且要使用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);
}
我没有测试过-这只是我的第一个想法,但您可以在此基础上进行测试.
帕特里克