我正在尝试通过将数据绑定(bind)到通用列表
来填充嵌套转发器
。
用户将能够随意在此通用列表
中添加/删除值。
所有这些都巧妙地包含在 Ajax 更新面板
中。
我现在遇到一个问题,当用户尝试向通用列表
添加值时,它仅添加`初始值,然后在单击添加更多值时不断更新该值。
我怀疑这是因为通用列表
没有确定其初始数据或其他内容;但我真的不太确定。
请有人帮忙。
挑战.cs
public class challenge
{
public class Team
{
public string TeamName { get; set; }
}
public class Member:Team
{
public string Name { get; set; }
}
//This is just a test, but I cant get a list in a class file to work properly.
public class ChallengeList
{
public List<Member> Member()
{
return null;
}
}
}
Page.cs
private List<challenge.Member> Members = new List<challenge.Member>();
protected void Page_Load(object sender, EventArgs e)
{
if (Page.IsPostBack) return;
lblCurrent.Text = SiteSession.Current.Nickname;
lblChallenge.Text = Request.QueryString["Challenge"];
//Add the initial teams
PopulateTeamRepeater();
AddData();
}
private List<challenge.Member> AddData()
{
Members.Add(
new challenge.Member
{
Name = SiteSession.Current.Nickname,
TeamName = "Team One"
});
Members.Add(
new challenge.Member
{
Name = Request.QueryString["Challenge"],
TeamName = "Team Two"
});
return Members;
}
/// <summary>
/// Add the selected member to the team
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void drpTeams_SelectedIndexChanged(object sender, EventArgs e)
{
Members.Add(
new challenge.Member
{
Name = tbMemberAuto.Text,
TeamName = drpTeams.SelectedItem.Value
});
PopulateTeamRepeater();
}
更新:中继器的绑定(bind)(同一页面)
/// <summary>
/// Populates the Team repeater control with the amount of teams the user has selected
/// </summary>
private void PopulateTeamRepeater()
{
ArrayList cArrayList = new ArrayList(); //Main holder
StringBuilder sb = new StringBuilder(); //Temp holer
try
{
//Get all team numbers
foreach (challenge.Member Team in AddData())
{
//Add it to the string builder
sb.Append(Team.TeamName + ";");
}
//Split the string to get the strings (As a temporary holder)
string[] cs = sb.ToString().Split(';');
//Add the groups (unique) to the next holder
foreach (string s in cs.Where(s => !cArrayList.Contains(s)))
{
cArrayList.Add(s);
}
rptTeam.DataSource = cArrayList;
rptTeam.DataBind();
}
catch (Exception es)
{
misc.ChangeInfo(Master.Page, "Error filling teams: " + es.Message, "ui-state-error");
}
}
/// <summary>
/// Populate the Member repeater based on the Team
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void rptTeam_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
Repeater rptMembers = (Repeater)e.Item.FindControl("rptMembers");
Label lblTeam = (Label)e.Item.FindControl("lblTeam");
rptMembers.DataSource = AddData().Where(m => m.TeamName == lblTeam.Text);
rptMembers.DataBind();
}
最佳答案
您可以将它们保持在 View 状态:
const string cChalMemNameConst = "ChalMem_cnst";
public List<challenge.Member> Members
{
get
{
if (!(ViewState[cChalMemNameConst] is List<challenge.Member>))
{
// need to fix the memory and added to viewstate
ViewState[cChalMemNameConst] = new List<challenge.Member>();
}
return (List<challenge.Member>)ViewState[cChalMemNameConst];
}
}
同时添加 [Serializable]
您放置在 List<>
上的类的属性如:
[Serializable]
public class challenge
{
[Serializable]
public class Team
{
public string TeamName { get; set; }
}
[Serializable]
public class Member:Team
{
public string Name { get; set; }
}
[Serializable]
public class ChallengeList
{
public List<Member> Member()
{
return null;
}
}
}
注意:行 private List<challenge.Member> Members = new List<challenge.Member>();
必须通过上面的保存到 View 状态的语句来更改。
关于c# - 回发后如何将数据保留在通用列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13172048/