We help IT Professionals succeed at work.

We've partnered with Certified Experts, Carl Webster and Richard Faulkner, to bring you two Citrix podcasts. Learn about 2020 trends and get answers to your biggest Citrix questions!Listen Now

x

DataBound Repeater is losing it's datasource and values. Why is this happening?

tatton777
tatton777 asked
on
Medium Priority
284 Views
Last Modified: 2006-11-18
I am trying to use a repeater to add datarows to a table based on whether or not the repeaters CheckBox Item is checked. For some reason, the repeaters values are being reset when I trigger the event to add the checked repeater items to the datatable.

Here's the code:

  //==================================================
  // OtherFeesDropDownList_SelectedIndexChanged()
  //==================================================
  protected void OtherFeesDropDownList_SelectedIndexChanged(object sender, EventArgs e)
  {
    // Removes the default "- Select" value from the DropDownList
    OtherFeesDropDownList.Items.Remove(sv.InvalidSelection);

    AddFeesButton.Visible = true;

    OtherFeesTable = CreateFeeTable(OtherFeesTable, "OtherFees");
    FillOtherFeesDataTable(OtherFeesTable, OtherFeesDropDownList.SelectedItem.Text);
    OtherFeesRepeater.DataSource = OtherFeesTable;
    OtherFeesRepeater.DataBind();
    sv.OtherFeesTable = OtherFeesTable;
  }

  //==================================================
  // AddFeesButton_Click()
  //==================================================
  protected void AddFeesButton_Click(object sender, EventArgs e)
  {
    DataRow dtRow;
   
    //If the SelectedFeesTable hasn't been initialized, initialize it
    if (SelectedFeesTable == null)
    {
      SelectedFeesTable = CreateFeeTable(SelectedFeesTable, "SelectedFees");
    }

    foreach (RepeaterItem ri in this.OtherFeesRepeater.Items)
    {
      CheckBox cb = ri.FindControl("FeeCheckBox") as CheckBox;
      if (cb != null && cb.Checked)
      {
        Label lblFeeID = ri.FindControl("FeeIDLabel") as Label;
        Label lblFeeGroup = ri.FindControl("FeeGroupLabel") as Label;
        Label lblComment = ri.FindControl("CommentLabel") as Label;
        Label lblPrice = ri.FindControl("PriceLabel") as Label;

        dtRow = SelectedFeesTable.NewRow();
        dtRow["FeeID"] = lblFeeID.Text;
        dtRow["FeeGroup"] = lblFeeGroup.Text;
        dtRow["Comment"] = lblComment.Text;
        dtRow["Price"] = lblPrice.Text;
        SelectedFeesTable.Rows.Add(dtRow);
      }
    }
    SelectedFeesRepeater.DataSource = SelectedFeesTable;
    SelectedFeesRepeater.DataBind();
    sv.SelectedFeesTable = SelectedFeesTable;
  }
Comment
Watch Question

Commented:
do you have in page_load event "if (Page.IsPostBack) return;"?

like this:

private void Page_Load(object sender, System.EventArgs e)
{
      if (Page.IsPostBack)
            return;
               //your code here
}

Author

Commented:
I dont have any of the DataTable information in the Page_Load event, I am creating the tables in the two methods listed above and then storing them in session varialbes. Would it be helpful if I posted all code .cs and .aspx?

The thing I don't get, is that ASP controls are supposed to maintain state. Seems so strange that the ASP Repeater is losing state.

Commented:
Pplease post all the code for .cs and .aspx.

Author

Commented:
####### Here is the select_other_fees.aspx.cs #########

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using UserSession;


public partial class select_other_fees : System.Web.UI.Page
{
  private DataTable OtherFeesTable;
  private DataTable SelectedFeesTable;
  private SessionVariables sv = new SessionVariables();

  string zStudentID;

  protected void Page_Load(object sender, EventArgs e)
  {

    zStudentID = Server.HtmlEncode(Request.QueryString["sID"]);

    // Populate the StudentLabel, ParentLabel, DistrictLabel, SchoolLabel
    PopulateLabels();

    // Populate the OtherFeesDropDownList
    if (!IsPostBack)
      FillOtherFeesDropDownList();
   }

  //=========================================================
  // PopulateLabels()
  //=========================================================
  protected void PopulateLabels()
  {
    //----------------------------------------------
    // This 'using' block is used to get the values
    // for StudentLabel and ParentLabel
    //----------------------------------------------
    try
    {
      using (SqlConnection cn = new SqlConnection(sv.DistConn.ConnectionString))
      {
        cn.Open();
        using (SqlCommand cmd = new SqlCommand("SELECT DISTINCT School, StudentName " +
                                              "FROM FeeView " +
                                              "WHERE sMstFi_Id='" + zStudentID + "'", cn))
        {
          using (SqlDataReader reader = cmd.ExecuteReader())
          {
            while (reader.Read())
            {
              SchoolLabel.Text = "SCHOOL : " + reader.GetString(0).ToUpper();
              StudentLabel.Text = "STUDENT : " + reader.GetString(1).ToUpper();
            }
          }
        }
      }
    }
    catch (SqlException sqlEx)
    {
      ErrorMessageLabel.Visible = true;
      ErrorMessageLabel.Text = "Error accessing database : " + sqlEx.Message;
    }
    ParentLabel.Text = "PARENT : " + sv.ParentName;
    DistrictLabel.Text = "DISTRICT : " + sv.DistrictName.ToUpper();
  }

  //=========================================================
  // CreateFeeTable()
  //=========================================================
  protected DataTable CreateFeeTable(DataTable dt, string zTableName)
  {
    dt = new DataTable(zTableName);
    DataColumn dtColumn;


    // Create new DataColumn 'Fee_Id' and add it to
    // the RequiredFeesTable
    dtColumn = new DataColumn();
    dtColumn.DataType = System.Type.GetType("System.Int32");
    dtColumn.ColumnName = "FeeID";
    dtColumn.ReadOnly = true;
    dt.Columns.Add(dtColumn);

    // Create new DataColumn 'FeeGroup' and add it to
    // the RequiredFeesTable
    dtColumn = new DataColumn();
    dtColumn.DataType = System.Type.GetType("System.String");
    dtColumn.ColumnName = "FeeGroup";
    dtColumn.ReadOnly = true;
    dt.Columns.Add(dtColumn);

    // Create new DataColumn 'Comment' and add it to
    // the RequiredFeesTable
    dtColumn = new DataColumn();
    dtColumn.DataType = System.Type.GetType("System.String");
    dtColumn.ColumnName = "Comment";
    dtColumn.ReadOnly = true;
    dt.Columns.Add(dtColumn);

    // Create new DataColumn 'Price' and add it to
    // the RequiredFeesTable
    dtColumn = new DataColumn();
    dtColumn.DataType = System.Type.GetType("System.Decimal");
    dtColumn.ColumnName = "Price";
    dtColumn.ReadOnly = true;
    dt.Columns.Add(dtColumn);

    return dt;
  }

  //=========================================================
  // FillOtherFeesDataTable()
  //=========================================================
  protected DataTable FillOtherFeesDataTable(DataTable dt, string zFeeGroup)
  {
   
    DataRow dtRow;

    string zCmdTxt = "SELECT sFeeDef_Id, FeeGroup, Comment, Price " +
                     "FROM sFeeDef WHERE FeeGroup='" + zFeeGroup + "'" +
                     "ORDER BY FeeGroup, Comment";
   
    //----------------------------------------------
    // This 'using' block fills a dataTable based
    // on it's FeeGroup
    //----------------------------------------------
    try
    {
      using (SqlConnection cn = new SqlConnection(sv.DistConn.ConnectionString))
      {
        cn.Open();

        using (SqlCommand cmd = new SqlCommand(zCmdTxt, cn))
        {
          using (SqlDataReader reader = cmd.ExecuteReader())
          {
            while (reader.Read())
            {
              string zFID = Convert.ToString(reader.GetInt32(0));
              string zFGP = reader.GetString(1);
              string zCMT = reader.GetString(2);
              string zPRC = Convert.ToString(reader.GetDecimal(3));

              dtRow = dt.NewRow();
              dtRow["FeeID"] = zFID;
              dtRow["FeeGroup"] = zFGP;
              dtRow["Comment"] = zCMT;
              dtRow["Price"] = zPRC;
              dt.Rows.Add(dtRow);
            }
          }
        }
      }
    }
    catch (SqlException sqlEx)
    {
      ErrorMessageLabel.Visible = true;
      ErrorMessageLabel.Text = "Error accessing database : " + sqlEx.Message;
    }
    return dt;
  }

  //==================================================
  // FillOtherFeesDropDownList()
  //==================================================
  protected void FillOtherFeesDropDownList()
  {
    string strCommand = "SELECT DISTINCT FeeGroup " +
                        "FROM sFeeDef " +
                        "WHERE FeeGroup <>'R' AND FeeGroup <> 'N' AND FeeGroup <> 'Generic'" +
                        "ORDER BY FeeGroup ASC";
   
    SqlConnection cn = new SqlConnection(sv.DistConn.ConnectionString);
    SqlDataAdapter myCommand = new SqlDataAdapter(strCommand, cn);

    DataSet ds = new DataSet();
    myCommand.Fill(ds);

    OtherFeesDropDownList.DataSource = ds;
    OtherFeesDropDownList.DataTextField = "FeeGroup";
    OtherFeesDropDownList.DataValueField = "FeeGroup";
    OtherFeesDropDownList.DataBind();
  }

  //==================================================
  // OtherFeesDropDownList_SelectedIndexChanged()
  //==================================================
  protected void OtherFeesDropDownList_SelectedIndexChanged(object sender, EventArgs e)
  {
    OtherFeesDropDownList.Items.Remove(sv.InvalidSelection);

    FeeLabel1.Visible = true;
    PriceLabel1.Visible = true;
    SelectLabel1.Visible = true;
    AddFeesButton.Visible = true;

    OtherFeesTable = CreateFeeTable(OtherFeesTable, "OtherFees");
    FillOtherFeesDataTable(OtherFeesTable, OtherFeesDropDownList.SelectedItem.Text);
    OtherFeesRepeater.DataSource = OtherFeesTable;
    OtherFeesRepeater.DataBind();
    sv.OtherFeesTable = OtherFeesTable;
  }

  //==================================================
  // AddFeesButton_Click()
  //==================================================
  protected void AddFeesButton_Click(object sender, EventArgs e)
  {
    DataRow dtRow;

    if (SelectedFeesTable == null)
    {
      SelectedFeesTable = CreateFeeTable(SelectedFeesTable, "SelectedFees");
    }

    foreach (RepeaterItem ri in this.OtherFeesRepeater.Items)
    {
      CheckBox cb = ri.FindControl("FeeCheckBox") as CheckBox;
      if (cb != null && cb.Checked)
      {
        Label lblFeeID = ri.FindControl("FeeIDLabel") as Label;
        Label lblFeeGroup = ri.FindControl("FeeGroupLabel") as Label;
        Label lblComment = ri.FindControl("CommentLabel") as Label;
        Label lblPrice = ri.FindControl("PriceLabel") as Label;

        dtRow = SelectedFeesTable.NewRow();
        dtRow["FeeID"] = lblFeeID.Text;
        dtRow["FeeGroup"] = lblFeeGroup.Text;
        dtRow["Comment"] = lblComment.Text;
        dtRow["Price"] = lblPrice.Text;
        SelectedFeesTable.Rows.Add(dtRow);
      }
    }
    SelectedFeesRepeater.DataSource = SelectedFeesTable;
    SelectedFeesRepeater.DataBind();
    sv.SelectedFeesTable = SelectedFeesTable;
  }
}

####### Here is the SessionVariable.cs Class that I'm using in the class above ##########

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
namespace UserSession
{
  /// <summary>
  /// Summary description for clsSessionVariables.
  /// </summary>
  public class SessionVariables
  {
    //public UserSession()
    //{

    //}

    //----------------------------------------
    // Student Session Variables
    //----------------------------------------
    public string StudentID
    {
      get { return (string)System.Web.HttpContext.Current.Session["StudentID"]; }
      set { System.Web.HttpContext.Current.Session["StudentID"] = value; }
    }

    public string StudentName
    {
      get { return (string)System.Web.HttpContext.Current.Session["StudentName"]; }
      set { System.Web.HttpContext.Current.Session["StudentName"] = value; }
    }

    //----------------------------------------
    // Parent Session Variables
    //----------------------------------------
    public string ParentID
    {
      get { return (string)System.Web.HttpContext.Current.Session["ParentID"]; }
      set { System.Web.HttpContext.Current.Session["ParentID"] = value; }
    }

    public string ParentName
    {
      get { return (string)System.Web.HttpContext.Current.Session["ParentName"]; }
      set { System.Web.HttpContext.Current.Session["ParentName"] = value; }
    }

    public string SecurityLevel
    {
      get { return (string)System.Web.HttpContext.Current.Session["SecurityLevel"]; }
      set { System.Web.HttpContext.Current.Session["SecurityLevel"] = value; }
    }

    //----------------------------------------
    // State Session Variables
    //----------------------------------------
    public string StateName
    {
      get { return (string)System.Web.HttpContext.Current.Session["StateName"]; }
      set { System.Web.HttpContext.Current.Session["StateName"] = value; }
    }

    public string StateID
    {
      get { return (string)System.Web.HttpContext.Current.Session["StateID"]; }
      set { System.Web.HttpContext.Current.Session["StateID"] = value; }
    }

    //----------------------------------------
    // District Session Variables
    //----------------------------------------
    public string DistrictName
    {
      get { return (string)System.Web.HttpContext.Current.Session["DistrictName"]; }
      set { System.Web.HttpContext.Current.Session["DistrictName"] = value; }
    }

    public string DistrictID
    {
      get { return (string)System.Web.HttpContext.Current.Session["DistrictID"]; }
      set { System.Web.HttpContext.Current.Session["DistrictID"] = value; }
    }

    //----------------------------------------
    // Other Session Variables
    //----------------------------------------
    public string InvalidSelection
    {
      get { return (string)System.Web.HttpContext.Current.Session["InvalidSelection"]; }
      set { System.Web.HttpContext.Current.Session["InvalidSelection"] = value; }
    }

    //----------------------------------------
    // Object Session Variables
    //----------------------------------------
    public DataTable OtherFeesTable
    {
      get { return (DataTable)System.Web.HttpContext.Current.Session["OtherFeesTable"]; }
      set { System.Web.HttpContext.Current.Session["OtherFeesTable"] = value; }
    }

    public DataTable SelectedFeesTable
    {
      get { return (DataTable)System.Web.HttpContext.Current.Session["SelectedFeesTable"]; }
      set { System.Web.HttpContext.Current.Session["SelectedFeesTable"] = value; }
    }

    public SqlConnectionStringBuilder DistConn
    {
      get { return (SqlConnectionStringBuilder)System.Web.HttpContext.Current.Session["DistConn"]; }
      set { System.Web.HttpContext.Current.Session["DistConn"] = value; }
    }
  }
}

####### Here is select_other_fees.aspx ###########

<%@ Page Language="C#" MasterPageFile="~/MySchoolFees.master" AutoEventWireup="true" CodeFile="select_other_fees.aspx.cs" Inherits="select_other_fees" Title=":: MySchoolFees.com - Pay Other Fees ::" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
  <table width="100%" cellspacing="8">
    <tr>
      <td colspan="3">
        <span style="font-size: 12pt">Pay Other Fees</span></td>
    </tr>
    <tr>
      <td>
        <asp:Label ID="SpacerLabel1" runat="server" Width="25px"></asp:Label></td>
      <td>
        <table cellpadding="2" cellspacing="2" style="border-right: black thin solid; border-top: black thin solid;
          border-left: black thin solid; border-bottom: black thin solid" width="100%">
          <tr>
            <td bgcolor="#5e6ac6" colspan="2">
              <span style="color: #ffffff">Information</span></td>
          </tr>
          <tr>
            <td>
              <asp:Label ID="ParentLabel" runat="server"></asp:Label></td>
            <td>
              <asp:Label ID="DistrictLabel" runat="server"></asp:Label></td>
          </tr>
          <tr>
            <td>
              <asp:Label ID="StudentLabel" runat="server"></asp:Label></td>
            <td>
              <asp:Label ID="SchoolLabel" runat="server"></asp:Label></td>
          </tr>
        </table>
      </td>
      <td>
        <asp:Label ID="SpacerLabel2" runat="server" Width="25px"></asp:Label></td>
    </tr>
    <tr>
      <td>
      </td>
      <td>
        <table cellpadding="2" cellspacing="0" style="border-right: black thin solid;
          border-left: black thin solid; border-bottom: black thin solid; border-top: black thin solid;" width="100%">
          <tr>
            <td colspan="3" bgcolor="#5e6ac6" style="text-align: left">
              <table width="100%" cellpadding="0" cellspacing="0" border="0">
                <tr>
                  <td>
                    <span style="color: #ffffff">
                      <asp:Label ID="OtherFeesLabel" runat="server" Text="Other Fees"></asp:Label></span></td>
                  <td style="text-align: right">
                    <span style="color: #ffffff">Select Fee Type</span>
                    <asp:DropDownList ID="OtherFeesDropDownList" runat="server" OnSelectedIndexChanged="OtherFeesDropDownList_SelectedIndexChanged" AutoPostBack="True">
                    </asp:DropDownList></td>                  
                </tr>
              </table>
             
            </td>
          </tr>
          <tr>
            <td>
              <asp:Label ID="FeeLabel1" runat="server" Text="Fee" BackColor="Navy" ForeColor="White" Visible="False" Width="100%" Height="18px"></asp:Label></td>
            <td>
              <asp:Label ID="PriceLabel1" runat="server" Text="Price" style="text-align:center" BackColor="Navy" ForeColor="White" Visible="False" Width="100%" Height="18px"></asp:Label></td>
            <td style="text-align: left">
              <asp:Label ID="SelectLabel1" runat="server" BackColor="Navy"
                         ForeColor="White" Text="Select" style="text-align:center" Width="100%" Visible="False" Height="18px"></asp:Label></td>
          </tr>
         
           <%--Begin OtherFeesRepeater--%>
           <asp:Repeater ID="OtherFeesRepeater" runat="server" EnableViewState="false">
            <ItemTemplate>
              <tr>
               <td>
                 <asp:Label ID="FeeGroupLabel" runat="server" Visible="false" Text=<%# Eval("FeeGroup") %>>
                 </asp:Label>
                 <asp:Label ID="FeeIDLabel" runat="server" Visible="false" Text=<%# Eval("FeeID") %>>
                 </asp:Label>
                 <asp:Label ID="CommentLabel" runat="server" Text=<%#Eval ("Comment") %>>
                 </asp:Label>
               </td>
               <td align="right">
                 <asp:Label ID="PriceLabel" runat="server" Text=<%# Eval("Price") %>>
                 </asp:Label>
               </td>
               <td align="center">
                <asp:CheckBox ID="FeeCheckBox" runat="server" />
               </td>
             </tr>
            </ItemTemplate>
           </asp:Repeater>
           <%--End OtherFeesRepeater--%>
           
          <tr>
            <td colspan="2" style="text-align: right">
              <asp:Label ID="SpacerLabel3" runat="server" Width="150px"></asp:Label></td>
            <td style="text-align: right">
              <asp:Button ID="AddFeesButton" runat="server" Text="Add Fees" Visible="False" OnClick="AddFeesButton_Click" />
            </td>
          </tr>
         </table>
      </td>
    </tr>
         <tr>
      <td>
      </td>
    <tr>
      <td>
      </td>
      <td>
        <table width="100%" cellpadding="2" cellspacing="2" border="0" style="border-right: black thin solid;
          border-left: black thin solid; border-bottom: black thin solid; border-top: black thin solid;">
          <tr>
            <td>
              <span style="font-size: 12pt">
                <asp:Label ID="SummaryHeaderLabel" runat="server" Text="Summary"></asp:Label></span></td>
            <td>
            </td>
            <td colspan="2">
              <asp:Label ID="NoFeesSelectedLabel" runat="server" Text="No Fees Selected"></asp:Label></td>
          </tr>
          <tr>
            <td style="height: 18px">
            </td>
            <td style="height: 18px">
              <asp:Label ID="FeeLabel2" runat="server" Text="Fee" Visible="False"></asp:Label></td>
            <td style="height: 18px">
              <asp:Label ID="TypeLabel2" runat="server" Text="Type" Visible="False"></asp:Label></td>
            <td style="height: 18px; text-align: right">
              <asp:Label ID="PriceLabel2" runat="server" Text="Price" Visible="False"></asp:Label></td>
          </tr>
         
          <%-- Begin SelectedFeesRepeater --%>
          <asp:Repeater ID="SelectedFeesRepeater" runat="server" EnableViewState="false">
            <ItemTemplate>
              <tr>
                <td>
                </td>
                <td>
                 <asp:Label ID="FeeIDLabel" runat="server" Visible="false" Text=<%# Eval("FeeID") %>>
                 </asp:Label>
                 <asp:Label ID="FeeGroupLabel"  runat="server" Text='<%# Eval ("FeeGroup")%>'>
                 </asp:Label>
                </td>
                <td align="left">
                 <asp:Label ID="CommentLabel" runat="server" Text='<%#Eval ("Comment") %>'>
                 </asp:Label>

                </td>
                <td align="right">
                 <asp:Label ID="PriceLabel" runat="server" Text='<%# Eval("Price") %>'>
                 </asp:Label>
                </td>
              </tr>
            </ItemTemplate>
          </asp:Repeater>
          <%--End SelectedFeesRepeater--%>
         
          <tr>
            <td style="height: 18px">
            </td>
            <td style="height: 18px">
            </td>
            <td style="height: 18px">
            </td>
            <td style="height: 18px; text-align: center">
            </td>
          </tr>
          <tr>
            <td style="height: 18px">
            </td>
            <td style="height: 18px">
            </td>
            <td style="height: 18px; text-align: right">
              <asp:Label ID="TotalHeaderLabel" runat="server" Text="Total : " Visible="False"></asp:Label>
            </td>
            <td style="height: 18px; text-align: right">
              <asp:Label ID="TotalLabel" runat="server" Visible="False"></asp:Label></td>
          </tr>
          <tr>
            <td style="height: 18px">
            </td>
            <td style="height: 18px">
            </td>
            <td style="height: 18px; text-align: right">
            </td>
            <td style="height: 18px; text-align: right">
            </td>
          </tr>
          <tr>
            <td style="height: 18px">
            </td>
            <td style="height: 18px">
            </td>
            <td style="height: 18px; text-align: right">
            </td>
            <td style="height: 18px; text-align: right">
              <asp:Button ID="PayFeesButton" runat="server" Text="Pay Fees" Visible="False" />
              <asp:Button ID="ClearFeesButton" runat="server" Text="Clear Selected Fees" Visible="False" />
              <asp:Button ID="CancelButton" runat="server" Text="Cancel" Visible="False" /></td>
          </tr>
        </table>
      </td>
      <td>
      </td>
    </tr>
    <tr>
      <td>
      </td>
      <td>
      </td>
      <td>
      </td>
    </tr>
    <tr>
      <td>
      </td>
      <td>
      </td>
      <td>
      </td>
    </tr>
    <tr>
      <td>
      </td>
      <td>
      </td>
      <td>
      </td>
    </tr>
    <tr>
      <td>
      </td>
      <td>
      </td>
      <td>
      </td>
    </tr>
    <tr>
      <td colspan="3">
        <asp:Label ID="ErrorMessageLabel" runat="server" BackColor="Yellow" ForeColor="Red"
          Visible="False" Width="100%"></asp:Label></td>
    </tr>
  </table>
</asp:Content>



Commented:
did you try to change this line:
           <asp:Repeater ID="OtherFeesRepeater" runat="server" EnableViewState="false">

to this:

           <asp:Repeater ID="OtherFeesRepeater" runat="server" EnableViewState="true">


Not the solution you were looking for? Getting a personalized solution is easy.

Ask the Experts
Access more of Experts Exchange with a free account
Thanks for using Experts Exchange.

Create a free account to continue.

Limited access with a free account allows you to:

  • View three pieces of content (articles, solutions, posts, and videos)
  • Ask the experts questions (counted toward content limit)
  • Customize your dashboard and profile

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.