/// <summary> /// Set the columns to be displayed by the tree control /// </summary> /// <param name="columns"></param> internal void SetColumns(TreeGridDesignerColumnDescriptor[] columns) { if (columns == null) { throw new ArgumentNullException("columns"); } // the current column may now be out of range. // reset to 0 if that is the case if (CurrentColumn >= columns.Length) { CurrentColumn = 0; } _currentColumns = columns; // do initial percentage calculations. var percentages = new float[columns.Length]; var calculatedPercentage = 1.0F; var calculatedColumns = columns.Length; for (var i = 0; i < columns.Length; i++) { var columnPercentage = columns[i].InitialPercentage; if (columnPercentage != TreeGridDesignerColumnDescriptor.CalculatePercentage) { if (columnPercentage > calculatedPercentage) { percentages[i] = -1; continue; // using the initial percentage specified by this column would cause all // percentages to sum to more than 1, so we discard it. } calculatedPercentage -= columnPercentage; calculatedColumns--; percentages[i] = columnPercentage; } else { percentages[i] = -1; } } // calculate percentage increment used for columns in which the percentage // is not specified explicitly var defaultPercentageIncr = calculatedColumns == 0 ? 0 : calculatedPercentage / calculatedColumns; // create headers var headers = new VirtualTreeColumnHeader[columns.Length]; float percentage = 0; for (var i = 0; i < headers.Length - 1; ++i) { if (percentages[i] == -1) { percentage += defaultPercentageIncr; } else { percentage += percentages[i]; } if (columns[i].ColumnIsCheckBox) { headers[i] = new VirtualTreeColumnHeader(columns[i].Name, percentage, StateImageList.ImageSize.Width); } else { headers[i] = new VirtualTreeColumnHeader(columns[i].Name, percentage); } } headers[headers.Length - 1] = new VirtualTreeColumnHeader(columns[headers.Length - 1].Name, 1f); SetColumnHeaders(headers, false); }
/// <summary> /// Update the appearance fields (string, glyph, and style) to the new header settings. This /// cannot be used to update the width or position of the header. /// </summary> /// <param name="columnHeader">The header with the current settings</param> /// <param name="displayColumn">The display column to update</param> public void UpdateItemAppearance(VirtualTreeColumnHeader columnHeader, int displayColumn) { if (IsHandleCreated) { var item = new NativeMethods.HDITEM(); SetAppearanceFields(ref columnHeader, ref item); if (item.mask != 0) { NativeMethods.SendMessage(Handle, NativeMethods.HDM_SETITEMW, OrderToIndex(displayColumn), ref item); } } }
private void SetAppearanceFields(ref VirtualTreeColumnHeader columnHeader, ref NativeMethods.HDITEM item) { var text = columnHeader.Text; var style = columnHeader.Style; var imageIndex = columnHeader.ImageIndex; var usingFormat = false; // Set the text if (text != null && text.Length != 0) { item.pszText = text; item.mask |= NativeMethods.HDITEM.Mask.HDI_TEXT; item.fmt |= NativeMethods.HDITEM.Format.HDF_STRING; usingFormat = true; } // Set the image if (imageIndex >= 0 && myAssociatedControl.HeaderImageList != null) { item.iImage = imageIndex; item.mask |= NativeMethods.HDITEM.Mask.HDI_IMAGE; item.fmt |= NativeMethods.HDITEM.Format.HDF_IMAGE; usingFormat = true; } // Update style fields if ((style & ~(VirtualTreeColumnHeaderStyles.DragDisabled | VirtualTreeColumnHeaderStyles.ColumnPositionLocked)) != 0) { usingFormat = true; // Set the alignment if (0 != (style & VirtualTreeColumnHeaderStyles.AlignCenter)) { item.fmt |= NativeMethods.HDITEM.Format.HDF_CENTER; } else if (0 != (style & VirtualTreeColumnHeaderStyles.AlignRight)) { item.fmt |= NativeMethods.HDITEM.Format.HDF_RIGHT; } // Set the image location if (0 != (style & VirtualTreeColumnHeaderStyles.ImageOnRight)) { item.fmt |= NativeMethods.HDITEM.Format.HDF_BITMAP_ON_RIGHT; } // Set the up or down arrows if (0 != (style & VirtualTreeColumnHeaderStyles.DisplayUpArrow)) { item.fmt |= NativeMethods.HDITEM.Format.HDF_SORTUP; } else if (0 != (style & VirtualTreeColumnHeaderStyles.DisplayDownArrow)) { item.fmt |= NativeMethods.HDITEM.Format.HDF_SORTDOWN; } } // Set owner draw if (0 != (style & (VirtualTreeColumnHeaderStyles.OwnerDraw | VirtualTreeColumnHeaderStyles.OwnerDrawOverlay))) { usingFormat = true; item.fmt |= NativeMethods.HDITEM.Format.HDF_OWNERDRAW; } if (usingFormat) { item.mask |= NativeMethods.HDITEM.Mask.HDI_FORMAT; } }
/// <summary> /// Add an item to the control. Always adds in the last position. /// </summary> /// <param name="columnHeader">The header information</param> /// <param name="itemWidth"></param> public void AddItem(VirtualTreeColumnHeader columnHeader, int itemWidth) { var item = new NativeMethods.HDITEM(); item.cxy = itemWidth; item.mask = NativeMethods.HDITEM.Mask.HDI_WIDTH; SetAppearanceFields(ref columnHeader, ref item); NativeMethods.SendMessage(Handle, NativeMethods.HDM_INSERTITEMW, int.MaxValue, ref item); }