c# - 回发后如何将数据保留在通用列表中

标签 c# asp.net nested-repeater

我正在尝试通过将数据绑定(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/

相关文章:

c# - System.Net.FtpClient openwrite 不会上传文件,除非我在退出前插休眠眠

c# - 在代码隐藏 (C#) 中更改 Css

asp.net - 如何在mvc View 中获取~的值?

c# - Repeater 中的 Repeater(基于 ajax 的网络应用程序)

c# - 带有字符串列表的嵌套转发器

c# - 计算 for 循环的大致运行时间

c# - ASP .NET WebAPI 无法访问路由

C# P/Invoke on CUDA DLL 最终导致 AccessViolationException

c# - 关闭记录集后是否必须处理 SqlCommand?