2010-04-28 47 views
1

我有一个关于Wicket的Datatable的问题。我目前使用DataTable来显示几列数据。如何显示Wicket Datatable,默认按特定列排序?

我的表被设置如下:

DataTable<Column> dataTable = new DataTable<Column>("columnsTable", columns, provider, maxRowsPerPage) { 
      @Override 
      protected Item<Column> newRowItem(String id, int index, IModel<Column> model) { 
       return new OddEvenItem<Column>(id, index, model); 
      } 
     }; 

列看起来像这样:

columns[0] = new PropertyColumn<Column>(new Model<String>("Description"), "description", "description"); 
columns[1] = new PropertyColumn<Column>(new Model<String>("Logic"), "columnLogic"); 
columns[2] = new PropertyColumn<Column>(new Model<String>("Type"), "dataType", "dataType"); 

这里是我的列数据提供:

public class ColumnSortableDataProvider extends SortableDataProvider<Column> { 
private static final long serialVersionUID = 1L; 

private List<Column> list = null; 

public ColumnSortableDataProvider(Table table) { 
    this.list = Arrays.asList(table.getColumns().toArray(new Column[0])); 
} 

public ColumnSortableDataProvider(List<Column> list) { 
    this.list = list; 
} 

@Override 
public Iterator<? extends Column> iterator(int first, int count) { 
    /* 
    first - first row of data 
    count - minimum number of elements to retrieve 
    So this method returns an iterator capable of iterating over {first, first+count} items 
    */ 
    Iterator<Column> iterator = null; 

    try { 
     if(getSort() != null) { 
      Collections.sort(list, new Comparator<Column>() { 
       private static final long serialVersionUID = 1L; 

       @Override 
       public int compare(Column c1, Column c2) { 
        int result=1; 
        PropertyModel<Comparable> model1= new PropertyModel<Comparable>(c1, getSort().getProperty()); 
        PropertyModel<Comparable> model2= new PropertyModel<Comparable>(c2, getSort().getProperty()); 

        if(model1.getObject() == null && model2.getObject() == null) 
         result = 0; 
        else if(model1.getObject() == null) 
         result = 1; 
        else if(model2.getObject() == null) 
         result = -1; 
        else 
         result = ((Comparable)model1.getObject()).compareTo(model2.getObject()); 

        result = getSort().isAscending() ? result : -result; 

        return result; 
       } 
      }); 
     } 

     if (list.size() > (first+count)) 
      iterator = list.subList(first, first+count).iterator(); 
     else 
      iterator = list.iterator(); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return iterator; 
} 

通过点击排序列完美工作,但我希望表最初被排序,默认情况下,描述列。我无法做到这一点。如果您需要查看其他代码,请告诉我。

谢谢! - D

回答

5

有几个超载setSort方法和setSortState方法在SortableDataProvider可以调用来设置此。

有关使用setSort的示例代码,请参阅examples page上Sorting DataView示例中的SortableContactDataProvider源代码。

+0

这工作完美。谢谢!!! – David 2010-04-29 17:12:13

+0

不客气!很高兴我能帮上忙。 – 2010-04-29 21:57:42

+0

嗨donroby @,我有另一个问题涉及到相同的代码。我已经在这里发布了,如果你有能力,你可以看看吗? 谢谢! http://stackoverflow.com/questions/2777448/page-expired-issue-with-back-button-and-wicket-sortabledataprovider-and-datatable – David 2010-05-05 23:30:15