/// <summary> /// Populate this Asset Group with it's children (both child groups and assets) /// Note that this may recurse through its children populating them also /// Child assets may be excluded !!! /// </summary> /// <returns></returns> public int Populate(bool recurse, bool ignoreChildAssets, bool applyStates) { // First get child groups LocationsDAO lwDataAccess = new LocationsDAO(); _groups = new AssetGroupList(lwDataAccess.GetGroups(this), _groupType); // ...then get child assets if (!ignoreChildAssets) { _assets = new AssetList(new AssetDAO().GetAssets(GroupID, GroupType, applyStates), ignoreChildAssets); } // If we have been requested to recurse then go through each group if (recurse) { foreach (AssetGroup childGroup in Groups) { childGroup.Populate(recurse, ignoreChildAssets, applyStates); } } // Show that we have populated this group Populated = true; return(0); }
/// <summary> /// This function is called to (re)initialize the network explorer view /// this is a tree control defined within NetworkExplorerView /// </summary> private void InitializeNetworkView() { // clear the existing view explorerView.Clear(); // Are we displaying the computers grouped into domains or user locations - this is held as a flag // in the work item controller NetworkWorkItemController wiController = explorerView.WorkItem.Controller as NetworkWorkItemController; bool showByDomain = wiController.DomainViewStyle; // First of all we need to create the root group (domain or location) LocationsDAO lwDataAccess = new LocationsDAO(); AssetGroup.GROUPTYPE displayType = (showByDomain) ? AssetGroup.GROUPTYPE.domain : AssetGroup.GROUPTYPE.userlocation; DataTable table = lwDataAccess.GetGroups(new AssetGroup(displayType)); _rootAssetGroup = new AssetGroup(table.Rows[0], displayType); // Add the root node to the tree first UltraTreeNode rootNode = new UltraTreeNode("root|" + _rootAssetGroup.FullName, _rootAssetGroup.Name); Bitmap rootImage = (showByDomain) ? Properties.Resources.domain16 : Properties.Resources.location_16; rootNode.Override.NodeAppearance.Image = rootImage; rootNode.Override.ExpandedNodeAppearance.Image = rootImage; rootNode.Tag = _rootAssetGroup; // Set the root node in the Explorer view - note that this will automatically expand the node which will // cause it to be populated explorerView.RootNode = rootNode; }
/// <summary> /// This function is responsible for the actual generation of the Applications Report /// It overrides the abstract definition in the base class and stores it's data in the DataSet /// </summary> public override void GenerateReport(UltraGrid grid) { // Delete any cached data as we are re-running the report _cachedAssetGroups = null; // Begin initialization of the Grid grid.BeginUpdate(); // Save the grid layout to a temporary file if (grid.Rows.Count != 0) { SaveTemporaryLayout(grid); } // Create a new dataSource _reportDataSet = new DataSet("auditdataDataSet"); grid.DataSource = _reportDataSet; // We will always need the list of assets so we may as well get it now LocationsDAO lwDataAccess = new LocationsDAO(); AssetGroup.GROUPTYPE displayType = AssetGroup.GROUPTYPE.userlocation; DataTable table = lwDataAccess.GetGroups(new AssetGroup(displayType)); _cachedAssetGroups = new AssetGroup(table.Rows[0], displayType); _cachedAssetGroups.Populate(true, _ignoreChildAssets, true); // Now apply the filter to these groups _cachedAssetGroups.ApplyFilters(_selectedGroups, _selectedAssets, _ignoreChildAssets); // Now that we have a definitive list of the assets (as objects) which we want to include in the // report we could really do with expanding this list so that ALL of the assets are in a single list // and not distributed among the publishers _cachedAssetList = _cachedAssetGroups.GetAllAssets(); // Create the list of report columns which will maintain the data for this report _auditDataReportColumns.Populate(_listSelectedFields , _dictionaryLabels , _publisherFilter , _showIncluded , _showIgnored); // Create the tables, columns and relationships as these may have changed since we loaded the report CreateTables(); // Clear any existing data out of the dataset _reportDataSet.Tables["AuditData"].Rows.Clear(); // Generate the data for the report GenerateReportData(); // reload the temprary layout saved around the report generation //LoadTemporaryLayout(grid); // ...and perform any required initialization of the grid InitializeGrid(grid); grid.EndUpdate(); }
/// <summary> /// return whether or not the specified named group is already a child of this group /// </summary> /// <param name="childname"></param> /// <returns></returns> public AssetGroup IsChildGroup(string childname) { // First get a list of our current children LocationsDAO lwDataAccess = new LocationsDAO(); AssetGroupList listChildren = new AssetGroupList(lwDataAccess.GetGroups(this), _groupType); return(listChildren.FindGroup(childname)); }
public void Populate(bool showByDomain, bool ignoreTopAssets, bool ignoreChildAssets) // CMD 8.4.2 Include additional parameter { LocationsDAO lwDataAccess = new LocationsDAO(); AssetGroup.GROUPTYPE displayType = (_showByDomain) ? AssetGroup.GROUPTYPE.domain : AssetGroup.GROUPTYPE.userlocation; DataTable table = lwDataAccess.GetGroups(new AssetGroup(displayType)); _rootAssetGroup = new AssetGroup(table.Rows[0], displayType); // +CMD 8.4.1 - Changes required to prevent performance issues with large databases. We can now elect to not display assets and also // the tree is load on demand if we do require assets so that we only load them if required. // // If we need to show assets at the root then populate this now if (!ignoreTopAssets) { _rootAssetGroup.Populate(false, false, true); } // Populate all levels for this group beneath this group again optionally including assets _rootAssetGroup.Populate(true, true, true); // Load on demand is active if we are displaying child assets locationsTree.Override.ShowExpansionIndicator = (ignoreChildAssets) ? ShowExpansionIndicator.CheckOnDisplay : ShowExpansionIndicator.CheckOnExpand; // -CMD 8.4.1 // begin updating the tree locationsTree.BeginUpdate(); // Add the root node to the tree first try { UltraTreeNode rootNode = new UltraTreeNode(null, _rootAssetGroup.Name); Bitmap rootImage = (_showByDomain) ? Properties.Resources.domain16 : Properties.Resources.location_16; rootNode.Override.NodeAppearance.Image = rootImage; rootNode.Override.ExpandedNodeAppearance.Image = rootImage; rootNode.Tag = _rootAssetGroup; rootNode.CheckedState = CheckState.Unchecked; // ...add the children to the tree beneath it now AddChildNodes(rootNode, _rootAssetGroup); // Set the root node in the Explore view locationsTree.Nodes.Add(rootNode); // Expand the root node rootNode.Expanded = true; } catch (Exception ex) { //MessageBox.Show("Exception adding tree nodes in [SelectLocationsControl::AddApplicationNode], the exception text was " + ex.Message); logger.Error(ex.Message); } // Finished updating the tree locationsTree.EndUpdate(); }
/// <summary> /// Load the records from the input file into the list view /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FormImportLocations_Load(object sender, EventArgs e) { // recover the root group as we need its name to prefix to all created location names LocationsDAO lwDataAccess = new LocationsDAO(); DataTable table = lwDataAccess.GetGroups(new AssetGroup(AssetGroup.GROUPTYPE.userlocation)); AssetGroup rootAssetGroup = new AssetGroup(table.Rows[0], AssetGroup.GROUPTYPE.userlocation); _rootName = rootAssetGroup.Name; // try and read the CSV file into the list view try { using (CSVReader csv = new CSVReader(_fromFile)) { // Read each line from the file noting that we MUST have 4 columns and 4 only string[] fields; while ((fields = csv.GetCSVLine()) != null) { if (fields.Length != 4) { continue; } // Add the 4 fields to the ListView UltraListViewSubItem[] subItemArray = new UltraListViewSubItem[3]; subItemArray[0] = new UltraListViewSubItem(); subItemArray[0].Value = fields[1]; subItemArray[1] = new UltraListViewSubItem(); subItemArray[1].Value = fields[2]; subItemArray[2] = new UltraListViewSubItem(); subItemArray[2].Value = fields[3]; // UltraListViewItem item = new UltraListViewItem(fields[0], subItemArray); item.CheckState = (lvRecords.Items.Count == 0) ? CheckState.Unchecked : CheckState.Checked; lvRecords.Items.Add(item); } } } catch (Exception ex) { MessageBox.Show("Failed to import the file " + _fromFile + ". Reason: " + ex.Message, "Import Failed"); } }
/// <summary> /// generate the most recent history records for each asset /// </summary> protected void GenerateMostRecentReportData() { // Get a complete list of groups and assets and then apply our filters to this list LocationsDAO lwDataAccess = new LocationsDAO(); AssetGroup.GROUPTYPE displayType = AssetGroup.GROUPTYPE.userlocation; DataTable table = lwDataAccess.GetGroups(new AssetGroup(displayType)); AssetGroup assetGroups = new AssetGroup(table.Rows[0], displayType); assetGroups.Populate(true, false, true); // Now apply the filter to these groups assetGroups.ApplyFilters(_selectedGroups, _selectedAssets, _ignoreChildAssets); // Now that we have a definitive list of the assets (as objects) which we want to include in the // report we could really do with expanding this list so that ALL of the assets are in a single list // and not distributed among the publishers AssetList listAssets = assetGroups.GetAllAssets(); // OK - get the last audit trail records for these assets - the last audit date is stored in the // Asset object so we don't need to get that again foreach (Asset asset in listAssets) { // Skip any assets not audited yet if (asset.LastAudit.Ticks == 0) { continue; } // Get the audit trail records for this asset DataTable historyTable = new AuditTrailDAO().GetAssetAuditHistory(asset, asset.LastAudit, DateTime.Now); // Add the entries in the data table as ATE records to our DataSet foreach (DataRow row in historyTable.Rows) { AuditTrailEntry ate = new AuditTrailEntry(row); AddChangesRecord(ate); } } }
/// <summary> /// Delete the current location from the database /// </summary> public bool Delete() { LocationsDAO lwDataAccess = new LocationsDAO(); // As locations are hierarchical we cannot just delete a location without first deleting ALL // children and we cannot do that if any of our descendants are still being referenced // Get a list of all of our children AssetGroupList children = new AssetGroupList(lwDataAccess.GetGroups(this), GroupType); // Loop through each child and try and delete them first before we delete ourselves - this actually // causes recursion through this deletion function as children may have children and so on... foreach (AssetGroup childGroup in children) { if (!childGroup.Delete()) { return(false); } } // Only now can we delete ourselves as all of our children have been handled. if (lwDataAccess.GroupDelete(this) != 0) { return(false); } // ...and audit the deletion AuditTrailEntry ate = new AuditTrailEntry(); ate.Date = DateTime.Now; ate.Class = AuditTrailEntry.CLASS.location; ate.Type = AuditTrailEntry.TYPE.deleted; ate.Key = _name; ate.AssetID = 0; ate.AssetName = ""; ate.Username = System.Environment.UserName; new AuditTrailDAO().AuditTrailAdd(ate); return(true); }
/// <summary> /// Populates the child folder of a tree node /// </summary> private void PopulateChildLocations(UltraTreeNode node) { // If we have already populated this node's Nodes collection, return if (node.HasNodes == true) { return; } // Get the locations beneath that specified AssetGroup parentGroup = node.Tag as AssetGroup; // So request the database for a list of locations beneath that specified LocationsDAO lwDataAccess = new LocationsDAO(); DataTable table = lwDataAccess.GetGroups(parentGroup); // ...and add these locations to the tree as children of the selected node foreach (DataRow row in table.Rows) { AssetGroup newLocation = new AssetGroup(row, AssetGroup.GROUPTYPE.userlocation); UltraTreeNode childNode = node.Nodes.Add(newLocation.FullName, newLocation.Name); childNode.Tag = newLocation; } }
/// <summary> /// Add the root item(s) to the locations tree /// </summary> private void PopulateRoot() { // Get the root node (they should only be one and one only) LocationsDAO lwDataAccess = new LocationsDAO(); DataTable table = lwDataAccess.GetGroups(new AssetGroup(AssetGroup.GROUPTYPE.userlocation)); if (table.Rows.Count == 0) { return; } AssetGroup rootLocation = new AssetGroup(table.Rows[0], AssetGroup.GROUPTYPE.userlocation); UltraTreeNode rootNode = this.locationsTree.Nodes.Add("home", rootLocation.Name); rootNode.Override.NodeAppearance.Image = Properties.Resources.location_16; rootNode.Override.ExpandedNodeAppearance.Image = Properties.Resources.location_16; rootNode.Tag = rootLocation; // ...and force an automatic expansion of the root node as we want to display the top level nodes // on entry to this pane rootNode.Expanded = true; // Ensure that the root node is selected rootNode.Selected = true; }
public void NetworkDiscoveryCompleteHandler(object sender, DataEventArgs <List <string[]> > e) { try { LocationsDAO lwDataAccess = new LocationsDAO(); string macAddress = String.Empty; string vendor = String.Empty; string ipAddress = String.Empty; // We need to get the root item as all of the domains need to be parented to this DataTable table = lwDataAccess.GetGroups(new AssetGroup(AssetGroup.GROUPTYPE.domain)); AssetGroup rootGroup = new AssetGroup(table.Rows[0], AssetGroup.GROUPTYPE.domain); // Get the child domains - as domains are single level we do not need to recurse rootGroup.Populate(false, false, true); // We'll loop through the domains first and add then to the database recovering their ids so that // we only have to do this once. for (int i = 0; i < e.Data.Count; i++) { string assetName = e.Data[i][0]; string groupName = e.Data[i][1]; // Does this domain already exist? AssetGroup childGroup = rootGroup.IsChildGroup(groupName); // No - add it as a new group both to the database and to the parent if (childGroup == null) { childGroup = new AssetGroup(AssetGroup.GROUPTYPE.domain); childGroup.Name = groupName; childGroup.ParentID = rootGroup.GroupID; childGroup.GroupID = lwDataAccess.GroupAdd(childGroup); rootGroup.Groups.Add(childGroup); } try { // Recover the IP address for the asset ipAddress = Utility.GetIpAddress(assetName); // try to get the MAC address and vendor from IP IPAddress hostIPAddress = IPAddress.Parse(ipAddress); byte[] ab = new byte[6]; int len = ab.Length; int r = SendARP((int)hostIPAddress.Address, 0, ab, ref len); macAddress = BitConverter.ToString(ab, 0, 6); } catch (Exception ex) { // if we hit an invalid IP error here we can just log and carry on log.Error(String.Format("Error {0} with IP address [{1}]", ex.Message, ipAddress)); } if (macAddress != String.Empty) { using (System.IO.StreamReader sr = new System.IO.StreamReader(System.IO.Path.Combine(Application.StartupPath, "oui.txt"))) { string line; while ((line = sr.ReadLine()) != null) { if (line.StartsWith(macAddress.Substring(0, 8))) { if (line.Substring(18).ToUpper().StartsWith("APPLE")) { vendor = line.Substring(18); } break; } } } } // Now that we have the ID of the group (even if we just added the group) we can now // add the asset to the database also. Asset newAsset = new Asset(); newAsset.Name = assetName; newAsset.MACAddress = macAddress.Replace('-', ':'); newAsset.Make = vendor; AssetList assetList = new AssetList(new AssetDAO().GetAssets(0, AssetGroup.GROUPTYPE.userlocation, false), true); bool bUpdateAsset = true; foreach (Asset existingAsset in assetList) { if (assetName == existingAsset.Name) { // this asset already exists - only need to check if domain or IP have changed // if they have, send it away to be updated if (existingAsset.IPAddress != ipAddress || existingAsset.DomainID != childGroup.GroupID) { newAsset = existingAsset; newAsset.IPAddress = newAsset.IPAddress != ipAddress ? ipAddress : newAsset.IPAddress; newAsset.DomainID = newAsset.DomainID != childGroup.GroupID ? childGroup.GroupID : newAsset.DomainID; } else { // asset exists, nothing has changed so don't process bUpdateAsset = false; } break; } } if (bUpdateAsset) { newAsset.DomainID = childGroup.GroupID; newAsset.IPAddress = ipAddress; // Add the asset newAsset.Add(); } // Does this asset already exist? //if (rootGroup.FindAsset(assetName) == null) //{ // newAsset.DomainID = childGroup.GroupID; // newAsset.IPAddress = ipAddress; // // Add the asset // newAsset.Add(); //} } } catch (Exception ex) { logger.Error(ex.Message); } //WorkItem.ExplorerView.RefreshView(); //WorkItem.TabView.RefreshView(); }
public void InsertComputer(string assetName, string groupName, string ipAddress, string macAddress) { LocationsDAO lwDataAccess = new LocationsDAO(); SettingsDAO lSettingsDao = new SettingsDAO(); // We need to get the root item as all of the domains need to be parented to this System.Data.DataTable table = lwDataAccess.GetGroups(new AssetGroup(AssetGroup.GROUPTYPE.domain)); AssetGroup rootGroup = new AssetGroup(table.Rows[0], AssetGroup.GROUPTYPE.domain); // Get the child domains - as domains are single level we do not need to recurse rootGroup.Populate(false, false, true); // We'll loop through the domains first and add then to the database recovering their ids so that // we only have to do this once. // Does this domain already exist? AssetGroup childGroup; lock (this) { childGroup = rootGroup.IsChildGroup(groupName); // No - add it as a new group both to the database and to the parent if (childGroup == null) { childGroup = new AssetGroup(AssetGroup.GROUPTYPE.domain); childGroup.Name = groupName; childGroup.ParentID = rootGroup.GroupID; childGroup.GroupID = lwDataAccess.GroupAdd(childGroup); rootGroup.Groups.Add(childGroup); } } string vendor = String.Empty; try { if (macAddress != String.Empty) { // // CMD IMPORTANT UNCOMMENT THESE LINES // using (System.IO.StreamReader sr = new System.IO.StreamReader(System.IO.Path.Combine(Application.StartupPath, "oui.txt"))) // { // string line; // while ((line = sr.ReadLine()) != null) // { // if (line.StartsWith(macAddress.Substring(0, 8))) // { // if (line.Substring(18).ToUpper().StartsWith("APPLE")) // { // vendor = line.Substring(18); // break; // } // } // } // } } } catch (FormatException) { } // Now that we have the ID of the group (even if we just added the group) we can now // add the asset to the database also. Asset newAsset = new Asset(); newAsset.Name = assetName; newAsset.MACAddress = macAddress.Replace('-', ':'); newAsset.Make = vendor; if (vendor.ToUpper().StartsWith("APPLE")) { // add as an Apple Device assetTypes.Populate(); AssetType parentAssetType = assetTypes.FindByName("Apple Devices"); if (parentAssetType == null) { // Now create a child of this asset type parentAssetType = new AssetType(); parentAssetType.Name = "Apple Devices"; parentAssetType.Auditable = false; parentAssetType.Icon = "apple.png"; parentAssetType.ParentID = 0; parentAssetType.Add(); // Update the internal list assetTypes.Add(parentAssetType); } assetTypes.Populate(); parentAssetType = assetTypes.FindByName("Apple Devices"); AssetType childAssetType = assetTypes.FindByName("Apple Device"); if (childAssetType == null) { // Now create a child of this asset type childAssetType = new AssetType(); childAssetType.Name = "Apple Device"; childAssetType.Auditable = false; childAssetType.Icon = parentAssetType.Icon; childAssetType.ParentID = parentAssetType.AssetTypeID; childAssetType.Add(); // Update the internal list assetTypes.Add(childAssetType); } assetTypes.Populate(); childAssetType = assetTypes.FindByName("Apple Device"); newAsset.AssetTypeID = childAssetType.AssetTypeID; } AssetList assetList = new AssetList(new AssetDAO().GetAssets(0, AssetGroup.GROUPTYPE.userlocation, false), true); bool bUpdateAsset = true; bool bSNMPAsset = false; bool bExistingAuditedAsset = false; foreach (Asset existingAsset in assetList) { if ((existingAsset.AgentVersion == "SNMP") && (existingAsset.IPAddress == ipAddress)) { bSNMPAsset = true; break; } if ((assetName == existingAsset.Name) && (groupName == existingAsset.Domain)) { // this asset already exists - only need to check if domain or IP have changed // if they have, send it away to be updated if (existingAsset.IPAddress != ipAddress || existingAsset.DomainID != childGroup.GroupID) { newAsset = existingAsset; newAsset.IPAddress = newAsset.IPAddress != ipAddress ? ipAddress : newAsset.IPAddress; newAsset.DomainID = newAsset.DomainID != childGroup.GroupID ? childGroup.GroupID : newAsset.DomainID; } else { // asset exists, nothing has changed so don't process bUpdateAsset = false; } break; } if (!bSNMPAsset && existingAsset.IPAddress == ipAddress && existingAsset.Domain != newAsset.Domain) { bExistingAuditedAsset = true; //check for any asset name change if so update asset with audittrail entry if (existingAsset.Name != assetName) { string strOldValue = existingAsset.Name; newAsset = existingAsset; newAsset.Name = assetName; newAsset.Update(); AuditTrailDAO objAuditTrailDAO = new AuditTrailDAO(); // Build a blank AuditTrailEntry AuditTrailEntry ate = CreateAteForAssetNameChange(newAsset); ate.Key = ate.Key + "|" + "Computer Name"; ate.OldValue = strOldValue; ate.NewValue = assetName; objAuditTrailDAO.AuditTrailAdd(ate); } } } if (bUpdateAsset && !bSNMPAsset && !bExistingAuditedAsset) { newAsset.Domain = childGroup.Name; newAsset.DomainID = childGroup.GroupID; newAsset.IPAddress = ipAddress; // Add the asset newAsset.Add(); if (lSettingsDao.GetSettingAsBoolean("AutoScanNetwork", false) && lSettingsDao.GetSettingAsBoolean("AutoScanDeployAgent", false)) { string scannerPath = System.IO.Path.Combine(Application.StartupPath, "scanners") + "\\auditagent\\default.xml"; System.IO.File.Copy(scannerPath, "AuditAgent\\AuditAgent.xml", true); Operation newOperation = new Operation(newAsset.AssetID, Operation.OPERATION.deployagent); newOperation.Add(); } } if (!bSNMPAsset) { Interlocked.Increment(ref _foundCounter); FireNetworkDiscoveryUpdate(new DiscoveryUpdateEventArgs(_foundCounter.ToString(), "Computer", _maximumCount, 0)); } }
/// <summary> /// Populates the UltraListView control with the child locations of the Location /// represented by the specified UltraTreeNode. /// </summary> private void PopulateListView(UltraTreeNode node) { AssetGroup parentGroup; if (node != null && node.Tag != null) { parentGroup = node.Tag as AssetGroup; } else { parentGroup = new AssetGroup(AssetGroup.GROUPTYPE.userlocation); } // Call BeginUpdate to prevent drawing while we are populating the control this.locationsList.BeginUpdate(); // Show a wait cursor since this could take a while this.Cursor = Cursors.WaitCursor; // Clear the Items collection to removes the directories and files // of the last folder we displayed this.locationsList.Items.Clear(); // So request the database for a list of locations beneath that specified LocationsDAO lwDataAccess = new LocationsDAO(); DataTable table = lwDataAccess.GetGroups(parentGroup); // Create an array of UltraListViewItems, with a size equal to the number of directories UltraListViewItem[] itemArrayLocations = new UltraListViewItem[table.Rows.Count]; // ...and add these locations to the tree as children of the selected node int index = 0; foreach (DataRow row in table.Rows) { AssetGroup newLocation = new AssetGroup(row, AssetGroup.GROUPTYPE.userlocation); // Create an array of UltraListViewSubItems UltraListViewSubItem[] subItemArray = new UltraListViewSubItem[2]; // Create new UltraListViewSubItem instances for this item subItemArray[0] = new UltraListViewSubItem(); subItemArray[1] = new UltraListViewSubItem(); // Assign the values to the UltraListViewSubItem instances subItemArray[0].Value = newLocation.StartIP; subItemArray[1].Value = newLocation.EndIP; // Create an UltraListViewItem instance UltraListViewItem item = new UltraListViewItem(newLocation.Name, subItemArray); // Store a reference to the associated Location in the item's Tag property item.Tag = newLocation; // Add the UltraListViewItem to the array itemArrayLocations[index++] = item; } // Add the items to the Items collection using the AddRange method, so that we only trigger two property // change notifications, as opposed to one for each item added to the collection. this.locationsList.Items.AddRange(itemArrayLocations); // Assign the items to their respective groups //this.AssignItemsToGroups(); // Auto-size the width of the 'Name' column; if the size of the Items collection is not too large, // size all items, but to avoid impacting performance, only size the ones that are currently on-screen // if there are a relatively large number of items. Infragistics.Win.UltraWinListView.ColumnAutoSizeMode autoSizeMode = Infragistics.Win.UltraWinListView.ColumnAutoSizeMode.Header; if (this.locationsList.Items.Count <= 100) { autoSizeMode |= Infragistics.Win.UltraWinListView.ColumnAutoSizeMode.AllItems; } else { autoSizeMode |= Infragistics.Win.UltraWinListView.ColumnAutoSizeMode.VisibleItems; } this.locationsList.MainColumn.PerformAutoResize(autoSizeMode); // Activate the first item if (this.locationsList.ActiveItem == null && this.locationsList.Items.Count > 0) { this.locationsList.ActiveItem = this.locationsList.Items[0]; } // Restore the cursor this.Cursor = Cursors.Default; // Call EndUpdate to resume drawing operations this.locationsList.EndUpdate(true); }