System.Windows.Forms.ListView.FindNearestItem C# (CSharp) Method

FindNearestItem() public method

public FindNearestItem ( SearchDirectionHint dir, Point point ) : System.Windows.Forms.ListViewItem
dir SearchDirectionHint
point System.Drawing.Point
return System.Windows.Forms.ListViewItem
		public ListViewItem FindNearestItem (SearchDirectionHint dir, Point point)
		{
			if (dir < SearchDirectionHint.Left || dir > SearchDirectionHint.Down)
				throw new ArgumentOutOfRangeException ("searchDirection");

			if (view != View.LargeIcon && view != View.SmallIcon)
				throw new InvalidOperationException ();

			if (virtual_mode) {
				SearchForVirtualItemEventArgs args = new SearchForVirtualItemEventArgs (false,
						false, false, String.Empty, point, 
						dir, 0);

				OnSearchForVirtualItem (args);
				int idx = args.Index;
				if (idx >= 0 && idx < virtual_list_size)
					return items [idx];

				return null;
			}

			ListViewItem item = null;
			int min_dist = Int32.MaxValue;

			//
			// It looks like .Net does a previous adjustment
			//
			switch (dir) {
				case SearchDirectionHint.Up:
					point.Y -= item_size.Height;
					break;
				case SearchDirectionHint.Down:
					point.Y += item_size.Height;
					break;
				case SearchDirectionHint.Left:
					point.X -= item_size.Width;
					break;
				case SearchDirectionHint.Right:
					point.X += item_size.Width;
					break;
			}

			for (int i = 0; i < items.Count; i++) {
				Point item_loc = GetItemLocation (i);

				if (dir == SearchDirectionHint.Up) {
					if (point.Y < item_loc.Y)
						continue;
				} else if (dir == SearchDirectionHint.Down) {
					if (point.Y > item_loc.Y)
						continue;
				} else if (dir == SearchDirectionHint.Left) {
					if (point.X < item_loc.X)
						continue;
				} else if (dir == SearchDirectionHint.Right) {
					if (point.X > item_loc.X)
						continue;
				}

				int x_dist = point.X - item_loc.X;
				int y_dist = point.Y - item_loc.Y;

				int dist = x_dist * x_dist  + y_dist * y_dist;
				if (dist < min_dist) {
					item = items [i];
					min_dist = dist;
				}
			}

			return item;
		}
		

Same methods

ListView::FindNearestItem ( SearchDirectionHint searchDirection, int x, int y ) : System.Windows.Forms.ListViewItem

Usage Example

Example #1
0
		public void FindNearestItem_Exceptions ()
		{
			ListView lvw = new ListView ();
			lvw.Items.Add ("A");
			lvw.Items.Add ("B");

			lvw.View = View.Details;
			try {
				lvw.FindNearestItem (SearchDirectionHint.Down, 0, 0);
				Assert.Fail ("#A1");
			} catch (InvalidOperationException) {
			}

			lvw.View = View.List;
			try {
				lvw.FindNearestItem (SearchDirectionHint.Down, 0, 0);
				Assert.Fail ("#A2");
			} catch (InvalidOperationException) {
			}

			lvw.View = View.Tile;
			try {
				lvw.FindNearestItem (SearchDirectionHint.Down, 0, 0);
				Assert.Fail ("#A3");
			} catch (InvalidOperationException) {
			}

			lvw.View = View.LargeIcon;
			try {
				lvw.FindNearestItem ((SearchDirectionHint)666, 0, 0);
			} catch (ArgumentOutOfRangeException) {
			}
		}
ListView