Feedback

C# - WPF Spalte für mehrere DataGrid-Elemente synchron halten

Veröffentlicht von am 20.05.2014
(0 Bewertungen)
Im hatte eine Auflistung mehrerer Grids untereinander, von denen eine Spalte mit der gleichen Spalte aller Grids identisch bleiben sollte.
GFU-Schulungen  [Anzeige]

C# Komplett

Sie kennen sich in objektorientierter Programmierung aus. Sie schreiben C++ oder Java? Und nun stehen Sie vor der Aufgabe, in C# Anwendungen zu erstellen. Das C# Komplett-Seminar verschafft Ihnen umfassende Programmierkenntnisse in dieser Sprache. Nach der Schulung entwickeln Sie selbständig Anwendungen mit C#. Sie kennen die Datentypen und Klassenbibliotheken der objektorientierten Programmiersprache C#. Der Komplettkurs setzt bei den Grundlagen von C# ein. Sie arbeiten mit Variablen und konvertieren Typen. Multithreading, Delegates, Generics sind nach dem Seminar für Sie kein Geheimnis mehr.

Visual Studio Team Foundation Server 2017/2015 (TFS) für Entwickler - Kompakt

Nach Teilnahme an dieser Schulung kennen Sie alle wesentlichen Funktionen des TFS für Entwickler. Sie setzen Software-Entwicklung mit dem Visual Studio Team Foundation Server erfolgreich um.

/// <summary>
/// Hält die Spaltenbreite einer Spalte mehrerer Grids identisch.
/// </summary>
public sealed class MultiGridColumnWidthSynchronizer
{
	private readonly int columnIndexToSync;
	private readonly List<DataGrid> grids;
	private double lastWidth;
	private int lastColumnCount;

	/// <summary>
	/// Hält die Spaltenbreite einer Spalte mehrerer Grids identisch.
	/// </summary>
	/// <param name="grids"></param>
	/// <param name="column">Spaltenindex der Spalte dessen Breite für alle Grids der gleichen Spalte gelten soll.
	/// <para>Stellen Sie sicher, dass jedes angegebene Grid genügend Spalten zur Verfügung hat.</para></param>
	public MultiGridColumnWidthSynchronizer(IEnumerable<DataGrid> grids, int column)
	{
		IsEnabled = true;
		this.grids = new List<DataGrid>(grids);
		columnIndexToSync = column;

		registerEvents(grids);
	}

	public bool IsEnabled { get; set; }

	private void registerEvents(IEnumerable<DataGrid> grids)
	{
		foreach (var curGrid in grids)
		{
			curGrid.LayoutUpdated -= curGrid_LayoutUpdated;
			curGrid.LayoutUpdated += curGrid_LayoutUpdated;
		}
	}

	private void curGrid_LayoutUpdated(object sender, EventArgs e)
	{
		if (!IsEnabled)
		{
			return;
		}

		// Alle Bezeichnung-Spalten aller Grids.
		var dataGridColumns = (from dataGridItem in grids
			where dataGridItem != null
			select dataGridItem.Columns[columnIndexToSync]).ToList();

		var senderColumn = dataGridColumns.FirstOrDefault(column => !Equals(Math.Round(column.ActualWidth, 1), lastWidth));

		double useWidth = senderColumn == null ? lastWidth : Math.Round(senderColumn.ActualWidth, 1);
		if (!useWidth.Equals(lastWidth))
		{
			if (lastColumnCount < dataGridColumns.Count &&
				useWidth < lastWidth)
			{
				useWidth = lastWidth;
			}

			foreach (var column in dataGridColumns.Where(column => !Equals(column.Width.DesiredValue, useWidth)))
			{
				column.Width = Double.IsNaN(useWidth) ? DataGridLength.Auto : useWidth;
			}

			lastWidth = useWidth;
		}

		lastColumnCount = dataGridColumns.Count;
	}

	public void UpdateGrids(IEnumerable<DataGrid> grids)
	{
		this.grids.Clear();
		this.grids.AddRange(grids);
		registerEvents(this.grids);
	}
}

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!