Jeans
расширяется Clothing
. В вашем конструкторе Jeans вы пытаетесь вызвать конструктор в классе Clothing
. Однако вы вызвали конструктор только с одним аргументом: super(size);
В Clothing нет конструктора с одним аргументом.
Есть несколько способов исправить это.
Вариант 1: по умолчанию «цвет» в джинсах.
public Jeans(String size) {
super( size, "Blue" );
}
Вариант 2: Добавить конструктор с одним аргументом в одежду.
public Clothing(String size) {
this.size = size;
this.color = "Blue"; // defaults all Clothing to blue unless otherwise specified
}
Вариант 3: добавить второй аргумент в конструктор Jeans и передать его в одежду.
public Jeans(String size, String color) {
super(size, color);
}
Можно использовать переменную сеанса для хранения последнего Выражения для сортировки и когда Вы сортируете сетку, следующий раз сравнивает выражение для сортировки сетки с Переменной сеанса, которая хранит последнее выражение для сортировки. Если столбцы равны, затем проверяют направление предыдущего вида и вида в противоположном направлении.
Пример:
DataTable sourceTable = GridAttendence.DataSource as DataTable;
DataView view = new DataView(sourceTable);
string[] sortData = ViewState["sortExpression"].ToString().Trim().Split(' ');
if (e.SortExpression == sortData[0])
{
if (sortData[1] == "ASC")
{
view.Sort = e.SortExpression + " " + "DESC";
this.ViewState["sortExpression"] = e.SortExpression + " " + "DESC";
}
else
{
view.Sort = e.SortExpression + " " + "ASC";
this.ViewState["sortExpression"] = e.SortExpression + " " + "ASC";
}
}
else
{
view.Sort = e.SortExpression + " " + "ASC";
this.ViewState["sortExpression"] = e.SortExpression + " " + "ASC";
}
Я устал от того, чтобы заниматься этой проблемой и поместил направление вида и столбец вида в ViewState....
Путем я сделал это подобно коду, что принятый ответ, если, бит несколько отличается так, я думал, что помещу его там также. Обратите внимание, что эта сортировка делается к DataTable, прежде чем она будет связана с GridView. DataSource.
Опция один: Использование ViewState
void DataGrid_Sorting(object sender, GridViewSortEventArgs e)
{
if (e.SortExpression == (string)ViewState["SortColumn"])
{
// We are resorting the same column, so flip the sort direction
e.SortDirection =
((SortDirection)ViewState["SortColumnDirection"] == SortDirection.Ascending) ?
SortDirection.Descending : SortDirection.Ascending;
}
// Apply the sort
this._data.DefaultView.Sort = e.SortExpression +
(string)((e.SortDirection == SortDirection.Ascending) ? " ASC" : " DESC");
ViewState["SortColumn"] = e.SortExpression;
ViewState["SortColumnDirection"] = e.SortDirection;
}
Опция два: Использование сессии
Обратите внимание, что следующее обеспечивается для целей прежней версии, если Вы видите его в поле, или что Вы все еще поддерживаете системы компании, которые предназначаются для более старых браузеров.
void DataGrid_Sorting(object sender, GridViewSortEventArgs e)
{
if (e.SortExpression == (string)HttpContext.Current.Session["SortColumn"])
{
// We are resorting the same column, so flip the sort direction
e.SortDirection =
((SortDirection)HttpContext.Current.Session["SortColumnDirection"] == SortDirection.Ascending) ?
SortDirection.Descending : SortDirection.Ascending;
}
// Apply the sort
this._data.DefaultView.Sort = e.SortExpression +
(string)((e.SortDirection == SortDirection.Ascending) ? " ASC" : " DESC");
HttpContext.Current.Session["SortColumn"] = e.SortExpression;
HttpContext.Current.Session["SortColumnDirection"] = e.SortDirection;
}
Для переключения возрастания и убывания я использую метод в BasePage своего приложения для кэширования направления вида и выражения для сортировки:
protected void SetPageSort(GridViewSortEventArgs e)
{
if (e.SortExpression == SortExpression)
{
if (SortDirection == "ASC")
{
SortDirection = "DESC";
}
else
{
SortDirection = "ASC";
}
}
else
{
SortDirection = "ASC";
SortExpression = e.SortExpression;
}
}
SortExpression и SortDirection являются оба свойствами в BasePage, которые хранят и получают их значения от ViewState.
Таким образом, все мои полученные страницы просто называют SetPageSort от Метода сортировки GridView и связывают GridView:
protected void gv_Sorting(object sender, GridViewSortEventArgs e)
{
SetPageSort(e);
BindGrid();
}
BindGrid проверяет SortExpression и использует его и SortDirection, чтобы сделать ORDERY на источнике данных сетки, чем-то вроде этого:
if (SortExpression.Length > 0)
{
qry.ORDER_BY(SortExpression + " " + SortDirection);
}
gv.DataSource = qry.ExecuteReader();
gv.DataBind();
Так, SetPageSort базового класса удаляет большую часть тяжелой работы сортировки GridView. Я чувствую, что забываю что-то, но это - общее представление.
Это было некоторое время, так как я использовал GridView, но я думаю, что необходимо установить свойство SortDirection сетки на то, что это в настоящее время прежде оставляет методом OnSorting.
Так....
List<V_ReportPeriodStatusEntity> items = GetPeriodStatusesForScreenSelection();
items.Sort(new Helpers.GenericComparer<V_ReportPeriodStatusEntity>(e.SortExpression, e.SortDirection));
grdHeader.SortDirection = e.SortDirection.Equals(SortDirection.Ascending) ? SortDirection.Descending : SortDirection.Ascending;
grdHeader.DataSource = items;
grdHeader.DataBind();
Автоматический двунаправленный сортирующий только работает с источником данных SQL. К сожалению, вся документация в MSDN предполагает использование этого таким образом, GridView может стать немного печальным.
Путем я делаю это путем отслеживания порядок самостоятельно. Например:
protected void OnSortingResults(object sender, GridViewSortEventArgs e)
{
// If we're toggling sort on the same column, we simply toggle the direction. Otherwise, ASC it is.
// e.SortDirection is useless and unreliable (only works with SQL data source).
if (_sortBy == e.SortExpression)
_sortDirection = _sortDirection == SortDirection.Descending ? SortDirection.Ascending : SortDirection.Descending;
else
_sortDirection = SortDirection.Ascending;
_sortBy = e.SortExpression;
BindResults();
}
Эта проблема отсутствует не только с источниками данных SQL, но и с Источниками Данных объектов также. Однако при установке DataSource динамично в коде, именно тогда это разлагается. К сожалению, MSDN иногда действительно очень плох на информации. Простое упоминание этого поведения (это не ошибка, а вопросы проектирования) сэкономило бы много времени. Во всяком случае я не очень склонен использовать Переменные сеанса для этого. Я обычно храню направление сортировки в ViewState.
Простое решение:
protected SortDirection GetSortDirection(string column)
{
SortDirection nextDir = SortDirection.Ascending; // Default next sort expression behaviour.
if (ViewState["sort"] != null && ViewState["sort"].ToString() == column)
{ // Exists... DESC.
nextDir = SortDirection.Descending;
ViewState["sort"] = null;
}
else
{ // Doesn't exists, set ViewState.
ViewState["sort"] = column;
}
return nextDir;
}
Очень похоже на сортировку GridView по умолчанию и облегченный режим ViewState.
ИСПОЛЬЗОВАНИЕ:
protected void grdHeader_OnSorting(object sender, GridViewSortEventArgs e)
{
List<V_ReportPeriodStatusEntity> items = GetPeriodStatusesForScreenSelection();
items.Sort(new Helpers.GenericComparer<V_ReportPeriodStatusEntity>(e.SortExpression, GetSortDirection(e.SortExpression));
grdHeader.DataSource = items;
grdHeader.DataBind();
}
Проблема с Session и Viewstate заключается в том, что вам также необходимо отслеживать элемент управления gridview, для которого хранятся SortColumn и Direction, если на странице имеется более одного представления сетки.
Альтернативой Session и Viewstate является добавление 2 атрибутов в Gridview и отслеживание таким образом столбца и направления.
Вот пример:
private void GridViewSortDirection(GridView g, GridViewSortEventArgs e, out SortDirection d, out string f)
{
f = e.SortExpression;
d = e.SortDirection;
//Check if GridView control has required Attributes
if (g.Attributes["CurrentSortField"] != null && g.Attributes["CurrentSortDir"] != null)
{
if (f == g.Attributes["CurrentSortField"])
{
d = SortDirection.Descending;
if (g.Attributes["CurrentSortDir"] == "ASC")
{
d = SortDirection.Ascending;
}
}
g.Attributes["CurrentSortField"] = f;
g.Attributes["CurrentSortDir"] = (d == SortDirection.Ascending ? "DESC" : "ASC");
}
}
У меня была ужасная проблема с этим, поэтому я, наконец, прибег к использованию LINQ, чтобы упорядочить DataTable перед назначением его представлению:
Dim lquery = From s In listToMap
Select s
Order By s.ACCT_Active Descending, s.ACCT_Name
В частности, я действительно нашел DataView.Sort и DataGrid. Методы сортировки ненадежны при сортировке логического поля.
Надеюсь, это кому-то поможет.