const int CSTATE_SORTDIRECTION = 7;
const int CSTATE_SORTEXPRESSION = 8;
const int CSTATE_COUNT = 9;
+
+ delegate void GroupStart ();
ITemplate _emptyDataTemplate;
ITemplate _emptyItemTemplate;
protected virtual ListViewItem CreateEmptyItem ()
{
- if (_emptyDataTemplate != null) {
+ if (_emptyItemTemplate != null) {
ListViewItem item = CreateItem (ListViewItemType.EmptyItem);
InstantiateEmptyItemTemplate (item);
OnItemCreated (new ListViewItemEventArgs (item));
int displayIndex = 0;
ListViewDataItem lvdi;
int startIndex = dataSource.StartRowIndex;
- int numberOfGroups = (dataSource.Count / groupItemCount) - 1;
+ int dataCount = dataSource.Count;
+ int numberOfGroups = (dataCount / groupItemCount) + (dataCount % groupItemCount) - 1;
+ // This is disabled for now, until a bug in gmcs/JIT is fixed
+// GroupStart groupStart = () => {
+// if (groupItemCounter <= 0) {
+// groupItemCounter = groupItemCount;
+// currentGroup = StartNewGroup (numberOfGroups >= 1, ref gpos, ref firstItemIndexInGroup);
+// numberOfGroups--;
+// itemPosInGroup = firstItemIndexInGroup;
+// _groupedItemsContainerItemCount++;
+// needSeparator = false;
+// }
+// };
foreach (object item in dataSource) {
+ // groupStart ();
if (groupItemCounter <= 0) {
groupItemCounter = groupItemCount;
currentGroup = StartNewGroup (numberOfGroups >= 1, ref gpos, ref firstItemIndexInGroup);
_groupedItemsContainerItemCount++;
needSeparator = false;
}
-
if (needSeparator && haveSeparatorTemplate)
InsertSeparatorItem (currentGroup, itemPosInGroup++);
needSeparator = true;
}
+ //groupStart ();
if (groupItemCounter <= 0) {
groupItemCounter = groupItemCount;
currentGroup = StartNewGroup (numberOfGroups >= 1, ref gpos, ref firstItemIndexInGroup);
_groupedItemsContainerItemCount++;
needSeparator = false;
}
-
+
if (insertPosition == InsertItemPosition.LastItem) {
- if (needSeparator && haveSeparatorTemplate) {
- container = new ListViewItem ();
- InstantiateItemSeparatorTemplate (container);
- AddControlToContainer (container, currentGroup, itemPosInGroup++);
- groupItemCounter--;
- }
-
+ if (needSeparator && haveSeparatorTemplate)
+ InsertSeparatorItem (currentGroup, itemPosInGroup++);
+
+ //groupStart ();
if (groupItemCounter <= 0) {
groupItemCounter = groupItemCount;
currentGroup = StartNewGroup (numberOfGroups >= 1, ref gpos, ref firstItemIndexInGroup);
numberOfGroups--;
itemPosInGroup = firstItemIndexInGroup;
_groupedItemsContainerItemCount++;
+ needSeparator = false;
}
-
+
lvi = CreateInsertItem ();
InstantiateInsertItemTemplate (lvi);
AddControlToContainer (lvi, currentGroup, itemPosInGroup++);
groupItemCounter--;
}
+
+ if (groupItemCounter > 0 && _emptyItemTemplate != null) {
+ while (groupItemCounter > 0) {
+ if (haveSeparatorTemplate)
+ InsertSeparatorItem (currentGroup, itemPosInGroup++);
+
+ lvi = CreateEmptyItem ();
+ AddControlToContainer (lvi, currentGroup, itemPosInGroup++);
+ groupItemCounter--;
+ }
+ }
return ret;
}
Control StartNewGroup (bool needSeparator, ref int position, ref int firstItemIndexInGroup)
{
- Control control = new Control ();
+ Control control = new ListViewContainer ();
InstantiateGroupTemplate (control);
Control placeholder = FindPlaceholder (ItemPlaceholderID, control);
if (placeholder == null)
--- /dev/null
+//
+// System.Web.UI.WebControls.ListViewContainer
+//
+// Authors:
+// Marek Habersack (mhabersack@novell.com)
+//
+// (C) 2007-2008 Novell, Inc
+//
+
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+#if NET_3_5
+using System;
+using System.Web;
+using System.Web.UI;
+
+namespace System.Web.UI.WebControls
+{
+ // This class is necessary because each instance of the group template must define unique
+ // IDs for its children. The presence of this class can be seen when looking at the trace of
+ // any ASP.NET page with ListView control using item grouping.
+ internal class ListViewContainer : Control, INamingContainer
+ {
+ // Since the group template may contain command-triggering controls and we're
+ // wrapping it, we need to pass the command event up the chain, or it will get lost
+ // otherwise.
+ protected override bool OnBubbleEvent (object source, EventArgs e)
+ {
+ CommandEventArgs args = e as CommandEventArgs;
+
+ if (args == null)
+ return false;
+
+ RaiseBubbleEvent (this, args);
+ return true;
+ }
+ }
+}
+#endif