internal void OnHeaderClicked(MouseEventArgs e) { if (!IsSortable) { return; } var list = List; var sc = SortCriteria; var curSf = SortField; var newSf = new ListSortField() { PropertyName = Property.Name, SortDirection = ListSortDirection.Ascending }; if (e.CtrlKey && curSf != null) { sc.Remove(curSf); } else if (e.CtrlKey && sc != null) { sc.Add(newSf); } else if (curSf != null) { curSf.SortDirection = ListSortDirection.Toggle(curSf.SortDirection); } else if (list != null) { list.SortCriteria = new ListSortCriteria() { newSf } } ; if (list != null) { list.Sort(); } } #endregion }
/// <summary> /// Constructs a new grid view binding for the given GridView web control. /// Sets up grid listeners to handle the data binding. /// </summary> /// <param name="grid">The GridView control to be bound to the data list object.</param> protected GridViewBinding(GridView grid) : base(grid) { grid.RowDataBound += delegate(object sender, GridViewRowEventArgs e) { if (!(e.Row.DataItem is DataRow dataRow)) { return; } if (dataRow.Selected) { e.Row.ApplyStyle(grid.SelectedRowStyle); } BindToObject(e.Row, dataRow.List, dataRow); }; grid.PageIndexChanging += delegate(object sender, GridViewPageEventArgs e) { if (e.Cancel) { return; } grid.PageIndex = e.NewPageIndex; grid.DataBind(); }; grid.Sorting += delegate(object s, GridViewSortEventArgs e) { if (e.Cancel) { return; } if (list.SortCriteria != null && list.SortCriteria.Count == 1 && list.SortCriteria[0].PropertyName == e.SortExpression) { list.SortCriteria[0].SortDirection = ListSortDirection.Toggle(list.SortCriteria[0].SortDirection); } else { list.SortCriteria = new ListSortCriteria(); ListSortField sortFld = new ListSortField(); sortFld.PropertyName = e.SortExpression; sortFld.SortDirection = e.SortDirection == SortDirection.Ascending ? ListSortDirection.Ascending : ListSortDirection.Descending; list.SortCriteria.Add(sortFld); } list.Sort(); }; grid.RowEditing += delegate(object sender, GridViewEditEventArgs e) { if (e.Cancel || list == null) { return; } grid.EditIndex = e.NewEditIndex; int idx = grid.PageSize * grid.PageIndex + e.NewEditIndex; list.EditRow = new DataRow(list); list.EditRow.CopyFrom(list.GetData()[idx]); grid.DataBind(); }; grid.RowUpdating += delegate(object sender, GridViewUpdateEventArgs e) { if (e.Cancel || list == null) { return; } int idx = grid.PageSize * grid.PageIndex + e.RowIndex; grid.EditIndex = -1; list.EditRow = null; grid.DataBind(); }; grid.RowCancelingEdit += delegate(object sender, GridViewCancelEditEventArgs e) { if (e.Cancel || list == null) { return; } grid.EditIndex = -1; int idx = grid.PageSize * grid.PageIndex + e.RowIndex; if (list.EditRow != null) { list.GetData()[idx].CopyFrom(list.EditRow); list.EditRow = null; grid.DataBind(); // stop editing existing object } else { list.RemoveAt(idx); // delete new object on cancel } }; grid.RowDeleting += delegate(object sender, GridViewDeleteEventArgs e) { if (e.Cancel) { return; } int idx = grid.PageSize * grid.PageIndex + e.RowIndex; if (list != null) { list.RemoveAt(idx); } }; grid.RowCommand += delegate(object sender, GridViewCommandEventArgs e) { if (list == null || e.CommandName != "New") { return; } DataRow newRow = new DataRow(list); if (int.TryParse("" + e.CommandArgument, out int index)) { index++; } grid.EditIndex = index; list.Insert(grid.PageSize * grid.PageIndex + index, newRow); }; grid.SelectedIndexChanging += delegate(object sender, GridViewSelectEventArgs e) { if (e.Cancel || list == null) { return; } int idx = grid.PageSize * grid.PageIndex + e.NewSelectedIndex; list.SelectRow(idx); // cancel, since we don't really want the grid to set SelectedIndex, which doesn't work for with paging e.Cancel = true; }; // Defer data binding to the Load method after the view state is loaded. // Otherwise the view state will get corrupted. grid.Load += delegate { grid.DataBind(); }; grid.Unload += delegate { BindTo(null); }; }