C# ListView-将垂直网格线与标题分隔符对齐-使最后一列填充空间
我正在尝试用C#编写一个Windows窗体MusicLayer应用程序 应用程序应该显示一个列表,并有一些播放/停止按钮 我半小时前刚开始,但我的设计几乎完成了。现在我有三件事要解决。一个bug和两个好看的东西:C# ListView-将垂直网格线与标题分隔符对齐-使最后一列填充空间,c#,winforms,listview,C#,Winforms,Listview,我正在尝试用C#编写一个Windows窗体MusicLayer应用程序 应用程序应该显示一个列表,并有一些播放/停止按钮 我半小时前刚开始,但我的设计几乎完成了。现在我有三件事要解决。一个bug和两个好看的东西: 在这张照片上你可以看到我发现的虫子。你可能会说那没什么,但它很吸引人。我怎样才能解决这个问题 如何在不使内容居中的情况下使专栏标题居中 如何使最后一列填写listView的其余部分 您可以设置除第一列标题之外的所有列的TextAlign;它总是左对齐的。若要更改,您需要绘制它 没有
- 您可以设置除第一列标题之外的所有列的
;它总是左对齐的。若要更改,您需要绘制它TextAlign
- 没有自动填充选项,因此您需要编写一个
函数,该函数循环所有列(最后一列除外),并对其setColumnwidth
;然后从ListView的宽度进行求和
中减去总和,并设置最后一列的宽度Clientsize.Width
- 网格线中的显示错误对我来说是新的;到目前为止,我不知道如何修复它;也许业主图纸也会有帮助
void setLastColumnTofill(ListView lv)
{
int sum = 0;
int count = lv.Columns.Count;
for (int i = 0; i < count - 1; i++) sum += lv.Columns[i].Width;
lv.Columns[count - 1].Width = lv.ClientSize.Width - sum;
}
你可能想在颜色或宽度上玩一玩
如果您有一个包含用于显示排序顺序(或其他内容)的图像的ImageList,您也可以添加此项来绘制它们:
ColumnHeader colH = listView1.Columns[e.ColumnIndex];
int ii = colH.ImageIndex;
if (ii >= 0 && ii < imageList1.Images.Count)
e.Graphics.DrawImage(imageList1.Images[ii],
e.Bounds.Width + e.Bounds.X - imageList1.ImageSize.Width, 0);
ColumnHeader colH=listView1.Columns[e.ColumnIndex];
int ii=colH.ImageIndex;
如果(ii>=0&&ii
将
OwnerDraw
设置为true
后,您可以执行以下操作:
绘制列表视图
int sortIndex = 0;
private void listView1_DrawColumnHeader(object sender,
DrawListViewColumnHeaderEventArgs e)
{
var state = e.State == ListViewItemStates.Selected ?
VisualStyleElement.Header.Item.Hot : VisualStyleElement.Header.Item.Normal;
var sortOrder = listView1.Sorting == SortOrder.Ascending ?
VisualStyleElement.Header.SortArrow.SortedUp :
VisualStyleElement.Header.SortArrow.SortedDown;
var itemRenderer = new VisualStyleRenderer(state);
var sortRenderer = new VisualStyleRenderer(sortOrder);
var r = e.Bounds;
r.X += 1;
itemRenderer.DrawBackground(e.Graphics, r);
r.Inflate(-2, 0);
var flags = TextFormatFlags.Left | TextFormatFlags.VerticalCenter |
TextFormatFlags.SingleLine;
itemRenderer.DrawText(e.Graphics, r, e.Header.Text, false, flags);
var d = SystemInformation.VerticalScrollBarWidth;
if (e.ColumnIndex == sortIndex) //Sorted Column
sortRenderer.DrawBackground(e.Graphics,
new Rectangle(r.Right - d, r.Top, d, r.Height));
}
private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
{
e.DrawDefault = true; /*Use default rendering*/
}
private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
e.DrawDefault = true; /*Use default rendering*/
}
使用最后一列填充列表视图
private void ListViewSample_Load(object sender, EventArgs e)
{
var otherItemWisth= this.listView1.Columns.Cast<ColumnHeader>()
.Where(x => x.Index < this.listView1.Columns.Count - 1)
.Sum(x => x.Width);
this.listView1.Columns[this.listView1.Columns.Count - 1].Width =
this.listView1.ClientSize.Width - otherItemWisth;
}
private void ListViewSample_加载(对象发送方,事件参数e)
{
var otherItemWisth=this.listView1.Columns.Cast()
.Where(x=>x.Indexx.Width);
this.listView1.Columns[this.listView1.Columns.Count-1]。宽度=
this.listView1.ClientSize.Width-otherItemWith;
}
结果
您使用的是列表视图还是DataGridView?listView的详细信息使能功能正常:)(我懒得自己绘制所有这些东西,但自动填充是最重要的)谢谢!我添加了填充代码和业主图纸代码:-)完整答案。我建议使用
VisualStyleRenderer
,以获得更好的外观和感觉。如果你能看到我的帖子并发现它很有用,我会很高兴的:)是的,你是对的,在这种情况下,它确实做得很好+1.注意,您应该在列宽例程中使用LV的ClientSize.Width。我把它放在一个函数中,以便在以后事情可能发生变化时调用它。。
private void ListViewSample_Load(object sender, EventArgs e)
{
var otherItemWisth= this.listView1.Columns.Cast<ColumnHeader>()
.Where(x => x.Index < this.listView1.Columns.Count - 1)
.Sum(x => x.Width);
this.listView1.Columns[this.listView1.Columns.Count - 1].Width =
this.listView1.ClientSize.Width - otherItemWisth;
}