I don't know what complex logic that guy has written but DataTable allows to get distict values. Using that I have following sample
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[3] { new DataColumn("Id"), new DataColumn("Name"), new DataColumn("Country") });
dt.Rows.Add(1, "John Hammond", "United States");
dt.Rows.Add(1, "John Hammond", "United States");
dt.Rows.Add(2, "Mudassar Khan", "India");
dt.Rows.Add(3, "Suzanne Mathews", "France");
dt.Rows.Add(3, "Suzanne Mathews", "France");
dt.Rows.Add(3, "Suzanne Mathews", "France");
dt.Rows.Add(4, "Robert Schidner", "Russia");
dt.Rows.Add(4, "Robert Schidner", "Russia");
dt.Rows.Add(4, "Robert Schidner", "Russia");
dt.Rows.Add(4, "Robert Schidner", "Russia");
ViewState["dt"] = dt;
GridView1.DataSource = dt;
GridView1.DataBind();
}
}
protected void btnRemove_Click(object sender, EventArgs e)
{
DataTable dt = (DataTable)ViewState["dt"];
dt = dt.DefaultView.ToTable(true, "Id", "Name", "Country");
GridView2.DataSource = dt;
GridView2.DataBind();
}