/// <summary> /// 处理行单击。 /// </summary> /// <param name="info"></param> private void ProcessItemClick(TreeListHitTestInfo info) { var item = (TreeListItem)((VirtualTreeListItem)info.Element).Item; //按着ctrol切换选中状态 if (_controlPressed) { SelectItem(item, !item.Selected, false); } else if (_shiftPressed && _lastRowIndex != -1) { if (_lastRowIndex > _virMgr.Items.Count - 1) { return; } for (var i = SelectedItems.Count - 1; i >= 0; i--) { SelectedItems[i].SetSelected(false); } SelectedItems.InternalClear(); Invalidate(_bound.ItemBound); var start = _lastRowIndex; var end = item.Index; if (start > end) { start = end; end = _lastRowIndex; } for (var i = start; i <= end; i++) { if (!(_virMgr.Items[i].Item is TreeListItem t)) { continue; } t.SetSelected(true); SelectedItems.InternalAdd(t); } Invalidate(); RaiseItemSelectionChangedEvent(); } //选中且不是多选时,只触发单击事件 else if (item.Selected && SelectedItems.Count == 1) { RaiseItemClickEvent(item); return; } //选中当前行 else { SelectItem(item, true); HideEditor(); _lastRowIndex = item.Index; } RaiseItemClickEvent(item); }
/// <summary> /// 将一个数据对象绑定到 <see cref="TreeList"/> /// </summary> /// <param name="dataSource"></param> public void DataBind(object dataSource) { this.dataSource = dataSource; BeginUpdate(); var selectKeyValues = GetSelectedItems(); Items.Clear(); SelectedItems.InternalClear(); CheckedItems.InternalClear(); if (dataSource == null) { EndUpdate(); return; } if (dataSource is DataSet) { var ds = (DataSet)dataSource; if (ds.Tables.Count > 0) { BindDataTable(ds.Tables[0]); } } if (dataSource is DataTable) { BindDataTable((DataTable)dataSource); } else if (dataSource is IEnumerable) { BindEnumerable((IEnumerable)dataSource); } EndUpdate(); ReSelectItems(selectKeyValues); }