我有一個包含一些行的串列視圖,并且都有一個進度條。
調整列寬效果很好(按照設計),但是因為它很容易在行內移動文本,所以它不會移動進度條,調整它的大小甚至移動它..而不寫這個:
private void fileList_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e)
{
foreach (CustomProgressBar p in fileList.Controls.OfType<CustomProgressBar>().ToList())
{
if (e.ColumnIndex == 0)
{
p.Width = fileList.Columns[3].Width;
p.Left = fileList.Columns[e.ColumnIndex].Width 400;
}
else if (e.ColumnIndex == 1)
{
p.Width = fileList.Columns[3].Width;
p.Left = fileList.Columns[e.ColumnIndex].Width 227;
}
}
}
我想不通,所以這是我唯一的解決方案..“部分有效”。
初始 - 尚未調整大小

第 1 列調整大小

一般列調整大小(無特定順序)

關于根據列位置或寬度自動正確對齊專案,我有什么遺漏嗎?
我寫的代碼在第二列之后的效果為零,因為我無法確認它是否在 column1/column2 開始時正常作業。因此,如果它無論如何都會失敗,我看不到實作其余部分的意義。
任何幫助表示贊賞。
.NET 框架 4.8 / WinForms
--
注意: ProgressBar 對所有典型屬性的回應與常規progressBar 一樣。區別只是覆寫陰影和顏色。而已。
uj5u.com熱心網友回復:
您可以將ListView的
例子
代碼亮點:
- 設定 OwnerDraw = true。
- 處理 DrawColumnHeaders 并設定 e.DrawDefault = true。
- 處理 DrawSubItems 并為進度列繪制一個 ProgressBar。
- 為串列視圖啟用
例子
代碼亮點:
- 您需要調整控制元件大小,至少在以下事件中:ColumnWidthChanged、ColumnWidthChanging、ColumnReordered、SizeChanged。可能還有更多。
- 您還需要繼承 ListView 并處理 MouseWheel、VerticalScroll 和 Horizo??ntalScroll 事件。(通過處理WM_VSCROLL、WM_HSCROLL和WM_MOUSEWHEEL訊息。)
- 在子類中,您需要隱藏標題后面的控制元件。(通過發送LVM_GETHEADER訊息并使用GetWindowRect獲取標題矩形。)
- 調整控制元件位置和大小時,還需要考慮AutoScrollPosition。
這是代碼:
using System; using System.Drawing; using System.Runtime.InteropServices; using System.Windows.Forms; public class ListViewProgressBarExample : Form { private MyListView listView1; private void InitializeComponent() { listView1 = new MyListView(); listView1.Columns.Add("#", 50); listView1.Columns.Add("File name", 150); listView1.Columns.Add("Progress", 200); listView1.View = View.Details; listView1.Dock = DockStyle.Fill; listView1.FullRowSelect = true; Controls.Add(listView1); Text = "ListView ProgressBar Example"; Size = new Size(500, 300); } public ListViewProgressBarExample() { InitializeComponent(); listView1.Items.Add(new ListViewItem( new[] { "1", "lorem ipsum.txt", "10" })); listView1.Items.Add(new ListViewItem( new[] { "2", "dolor sit.txt", "0" })); listView1.Items.Add(new ListViewItem( new[] { "3", "amet.txt", "30" })); listView1.Items.Add(new ListViewItem( new[] { "4", "consectetur adipiscing.txt", "70" })); listView1.Items.Add(new ListViewItem( new[] { "5", "celit.txt", "50" })); listView1.Items.Add(new ListViewItem( new[] { "6", "adipiscing elit.txt", "100" })); foreach (ListViewItem item in listView1.Items) { var p = new ProgressBar(); p.Value = int.Parse(item.SubItems[2].Text); item.SubItems[2].Tag = p; if (p != null) { p.Bounds = item.SubItems[2].Bounds; listView1.Controls.Add(p); p.SendToBack(); } } listView1.ColumnWidthChanged = (sender, args) => AdjustControls(); listView1.ColumnReordered = (sender, args) => AdjustControls(); listView1.ColumnWidthChanging = (sender, args) => AdjustControls(); listView1.Scrolled = (sender, args) => AdjustControls(); listView1.SizeChanged = (sender, args) => AdjustControls(); } private void AdjustControls() { foreach (ListViewItem item in listView1.Items) { foreach (ListViewItem.ListViewSubItem subItem in item.SubItems) { if (subItem.Tag is Control) { var bound = subItem.Bounds; bound.Offset(listView1.AutoScrollOffset); var c = (Control)subItem.Tag; c.Bounds = subItem.Bounds; c.Visible = bound.Top >= listView1.GetHeaderHeight(); } } } } } public class MyListView : ListView { private const int WM_HSCROLL = 0x114; private const int WM_VSCROLL = 0x115; private const int WM_MOUSEWHEEL = 0x020A; public event EventHandler Scrolled; private const int LVM_GETHEADER = 0x1000 31; [StructLayout(LayoutKind.Sequential)] private struct RECT { public int Left; public int Top; public int Right; public int Bottom; } [DllImport("user32.dll")] private static extern IntPtr SendMessage( IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam); [DllImport("user32.dll")] private static extern bool GetWindowRect( IntPtr hwnd, out RECT lpRect); public int GetHeaderHeight() { var r = new RECT(); var hwnd = SendMessage(Handle, LVM_GETHEADER, IntPtr.Zero, IntPtr.Zero); if (GetWindowRect(hwnd, out r)) return r.Bottom - r.Top; return -1; } protected override void WndProc(ref Message m) { base.WndProc(ref m); if (m.Msg == WM_HSCROLL || m.Msg == WM_VSCROLL || m.Msg == WM_MOUSEWHEEL) Scrolled?.Invoke(this, EventArgs.Empty); } }
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/510002.html標籤:C#表格
