winform中ListView绑定问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了winform中ListView绑定问题相关的知识,希望对你有一定的参考价值。

最简单的绑定 为什么我绑定后数据总是不对

代码如下

listView1.GridLines = true;
listView1.FullRowSelect = true;
listView1.View = View.Details;
listView1.Scrollable = true;
listView1.MultiSelect = false;
listView1.HeaderStyle = ColumnHeaderStyle.Clickable;

SqlDataAdapter sda = new SqlDataAdapter("select * from Student_Basic", cn);

listView1.Columns.Add("学号",50,HorizontalAlignment.Center);
listView1.Columns.Add("姓名", 50, HorizontalAlignment.Center);
listView1.Columns.Add("性别", 50, HorizontalAlignment.Center);
listView1.Columns.Add("班级", 50, HorizontalAlignment.Center);
listView1.Columns.Add("专业", 150, HorizontalAlignment.Center);
listView1.Columns.Add("职业", 150, HorizontalAlignment.Center);
listView1.Columns.Add("城市", 150, HorizontalAlignment.Center);

DataTable dt = new DataTable();
sda.Fill(dt);

for (int i = 0; i < dt.Rows.Count;i++ )

ListViewItem itme = new ListViewItem();
itme.SubItems.Clear();
itme.SubItems.Add(dt.Rows[i][0].ToString());
itme.SubItems.Add(dt.Rows[i][1].ToString());
itme.SubItems.Add(dt.Rows[i][2].ToString());
itme.SubItems.Add(dt.Rows[i][4].ToString());
itme.SubItems.Add(dt.Rows[i][6].ToString());
itme.SubItems.Add(dt.Rows[i][8].ToString());
itme.SubItems.Add(dt.Rows[i][13].ToString());
listView1.Items.Add(itme);

参考技术A 应该指出错在哪里?这样代码好像没问题。。itme.SubItems.Add(dt.Rows[i][13].ToString());把序号改为确定的字段吧,数据多时考虑用foreach不要for了 参考技术B 既然是每行每行的添加,为什么不直接做成DataRow呢,我看你这里可能是定义DataTable 的时候没有对该DataTable 对象的列名设置,很有可能会因为这样而出错!

将按钮添加到 WinForms 中的 Listview

【中文标题】将按钮添加到 WinForms 中的 Listview【英文标题】:Adding button into a Listview in WinForms 【发布时间】:2010-10-02 03:32:09 【问题描述】:

有没有办法在 WinForms 应用程序的 ListView 内的单元格中添加按钮控件?

【问题讨论】:

【参考方案1】:

这是您可以重复使用的ListViewExtender 类的代码。它不是ListView 的派生类,基本上你只是声明一个特定的列显示为按钮而不是文本。按钮的文本是子项的文本。

它允许大尺寸的列表视图没有问题,不使用 p/invoke,并且还可以与水平滚动条一起使用(这里作为答案提出的一些代码没有或者对于大量项目非常慢)。请注意,它要求扩展 ListView 将 FullRowSelect 设置为 true 并将视图类型设置为 Details

这是一个使用它的示例代码:

namespace WindowsFormsApplication1

    public partial class Form1 : Form
    
        public Form1()
        
            InitializeComponent(); // you need to add a listView named listView1 with the designer
            listView1.FullRowSelect = true;
            ListViewExtender extender = new ListViewExtender(listView1);
            // extend 2nd column
            ListViewButtonColumn buttonAction = new ListViewButtonColumn(1);
            buttonAction.Click += OnButtonActionClick;
            buttonAction.FixedWidth = true;

            extender.AddColumn(buttonAction);

            for (int i = 0; i < 10000; i++)
            
                ListViewItem item = listView1.Items.Add("item" + i);
                item.SubItems.Add("button " + i);
            
        

        private void OnButtonActionClick(object sender, ListViewColumnMouseEventArgs e)
        
            MessageBox.Show(this, @"you clicked " + e.SubItem.Text);
        
    

这里是 ListViewExtender 代码和相关的类:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;

namespace WindowsFormsApplication1

    public class ListViewExtender : IDisposable
    
        private readonly Dictionary<int, ListViewColumn> _columns = new Dictionary<int, ListViewColumn>();

        public ListViewExtender(ListView listView)
        
            if (listView == null)
                throw new ArgumentNullException("listView");

            if (listView.View != View.Details)
                throw new ArgumentException(null, "listView");

            ListView = listView;
            ListView.OwnerDraw = true;
            ListView.DrawItem += OnDrawItem;
            ListView.DrawSubItem += OnDrawSubItem;
            ListView.DrawColumnHeader += OnDrawColumnHeader;
            ListView.MouseMove += OnMouseMove;
            ListView.MouseClick += OnMouseClick;

            Font = new Font(ListView.Font.FontFamily, ListView.Font.Size - 2);
        

        public virtual Font Font  get; private set; 
        public ListView ListView  get; private set; 

        protected virtual void OnMouseClick(object sender, MouseEventArgs e)
        
            ListViewItem item;
            ListViewItem.ListViewSubItem sub;
            ListViewColumn column = GetColumnAt(e.X, e.Y, out item, out sub);
            if (column != null)
            
                column.MouseClick(e, item, sub);
            
        

        public ListViewColumn GetColumnAt(int x, int y, out ListViewItem item, out ListViewItem.ListViewSubItem subItem)
        
            subItem = null;
            item = ListView.GetItemAt(x, y);
            if (item == null)
                return null;

            subItem = item.GetSubItemAt(x, y);
            if (subItem == null)
                return null;

            for (int i = 0; i < item.SubItems.Count; i++)
            
                if (item.SubItems[i] == subItem)
                    return GetColumn(i);
            
            return null;
        

        protected virtual void OnMouseMove(object sender, MouseEventArgs e)
        
            ListViewItem item;
            ListViewItem.ListViewSubItem sub;
            ListViewColumn column = GetColumnAt(e.X, e.Y, out item, out sub);
            if (column != null)
            
                column.Invalidate(item, sub);
                return;
            
            if (item != null)
            
                ListView.Invalidate(item.Bounds);
            
        

        protected virtual void OnDrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
        
            e.DrawDefault = true;
        

        protected virtual void OnDrawSubItem(object sender, DrawListViewSubItemEventArgs e)
        
            ListViewColumn column = GetColumn(e.ColumnIndex);
            if (column == null)
            
                e.DrawDefault = true;
                return;
            

            column.Draw(e);
        

        protected virtual void OnDrawItem(object sender, DrawListViewItemEventArgs e)
        
            // do nothing
        

        public void AddColumn(ListViewColumn column)
        
            if (column == null)
                throw new ArgumentNullException("column");

            column.Extender = this;
            _columns[column.ColumnIndex] = column;
        

        public ListViewColumn GetColumn(int index)
        
            ListViewColumn column;
            return _columns.TryGetValue(index, out column) ? column : null;
        

        public IEnumerable<ListViewColumn> Columns
        
            get
            
                return _columns.Values;
            
        

        public virtual void Dispose()
        
            if (Font != null)
            
                Font.Dispose();
                Font = null;
            
        
    

    public abstract class ListViewColumn
    
        public event EventHandler<ListViewColumnMouseEventArgs> Click;

        protected ListViewColumn(int columnIndex)
        
            if (columnIndex < 0)
                throw new ArgumentException(null, "columnIndex");

            ColumnIndex = columnIndex;
        

        public virtual ListViewExtender Extender  get; protected internal set; 
        public int ColumnIndex  get; private set; 

        public virtual Font Font
        
            get
            
                return Extender == null ? null : Extender.Font;
            
        

        public ListView ListView
        
            get
            
                return Extender == null ? null : Extender.ListView;
            
        

        public abstract void Draw(DrawListViewSubItemEventArgs e);

        public virtual void MouseClick(MouseEventArgs e, ListViewItem item, ListViewItem.ListViewSubItem subItem)
        
            if (Click != null)
            
                Click(this, new ListViewColumnMouseEventArgs(e, item, subItem));
            
        

        public virtual void Invalidate(ListViewItem item, ListViewItem.ListViewSubItem subItem)
        
            if (Extender != null)
            
                Extender.ListView.Invalidate(subItem.Bounds);
            
        
    

    public class ListViewColumnMouseEventArgs : MouseEventArgs
    
        public ListViewColumnMouseEventArgs(MouseEventArgs e, ListViewItem item, ListViewItem.ListViewSubItem subItem)
            : base(e.Button, e.Clicks, e.X, e.Y, e.Delta)
        
            Item = item;
            SubItem = subItem;
        

        public ListViewItem Item  get; private set; 
        public ListViewItem.ListViewSubItem SubItem  get; private set; 
    

    public class ListViewButtonColumn : ListViewColumn
    
        private Rectangle _hot = Rectangle.Empty;

        public ListViewButtonColumn(int columnIndex)
            : base(columnIndex)
        
        

        public bool FixedWidth  get; set; 
        public bool DrawIfEmpty  get; set; 

        public override ListViewExtender Extender
        
            get
            
                return base.Extender;
            
            protected internal set
            
                base.Extender = value;
                if (FixedWidth)
                
                    base.Extender.ListView.ColumnWidthChanging += OnColumnWidthChanging;
                
            
        

        protected virtual void OnColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e)
        
            if (e.ColumnIndex == ColumnIndex)
            
                e.Cancel = true;
                e.NewWidth = ListView.Columns[e.ColumnIndex].Width;
            
        

        public override void Draw(DrawListViewSubItemEventArgs e)
        
            if (_hot != Rectangle.Empty)
            
                if (_hot != e.Bounds)
                
                    ListView.Invalidate(_hot);
                    _hot = Rectangle.Empty;
                
            

            if ((!DrawIfEmpty) && (string.IsNullOrEmpty(e.SubItem.Text)))
                return;

            Point mouse = e.Item.ListView.PointToClient(Control.MousePosition);
            if ((ListView.GetItemAt(mouse.X, mouse.Y) == e.Item) && (e.Item.GetSubItemAt(mouse.X, mouse.Y) == e.SubItem))
            
                ButtonRenderer.DrawButton(e.Graphics, e.Bounds, e.SubItem.Text, Font, true, PushButtonState.Hot);
                _hot = e.Bounds;
            
            else
            
                ButtonRenderer.DrawButton(e.Graphics, e.Bounds, e.SubItem.Text, Font, false, PushButtonState.Default);
            
        
    

【讨论】:

这段代码非常有趣,并且有非常方便的功能,特别是在运行时使用,但我无法让它工作,列表视图仍然是空的并且没有显示任何按钮。 非常适合我。我唯一需要做的你没有提到的就是在列表视图中添加 2 列 但是除了第二列之外它不起作用如何插入按钮而不是第二列我已经更改了索引但它不起作用 您好@Simon,感谢您的精彩回答,我从您的 ButtonRender 中替换了 TextBoxRender。我仍然得到一个按钮,任何想法来实现文本框? 奇怪,这是唯一使用“按钮相关”代码的地方。你应该问另一个问题。【参考方案2】:

ListView 本身(或 ListViewItem)不能用作任何类型的容器,因此无法直接添加控件,但它是可行的。我已经成功使用了这个扩展的 ListView:Embedding Controls in a ListView。

【讨论】:

【参考方案3】:

这是 WinForms 的最佳自定义列表视图控件。ObjectListView

【讨论】:

【参考方案4】:

为了使 Simon Mourier 的扩展器工作,缺少以下行:

extender.AddColumn(buttonAction);

这是,它应该看起来像:

ListViewExtender extender = new ListViewExtender(listSummary);
ListViewButtonColumn buttonAction = new ListViewButtonColumn(2);
buttonAction.Click += OnButtonActionClick;
buttonAction.FixedWidth = true;
extender.AddColumn(buttonAction);

【讨论】:

ListViewButtonColumn(2); 它仅适用于 1,但不适用于其他列,为什么它仅适用于 ListViewButtonColumn(1); @office302 - 您应该首先将列添加到 listView。如果首先没有列,则添加按钮列将不起作用。 我无法让它工作,即使使用预先添加的列(文本)和您的代码。没有显示任何按钮。【参考方案5】:

也许这很有趣?

http://www.codeproject.com/KB/list/extendedlistviews.aspx

【讨论】:

【参考方案6】:

不,标准的 Windows 窗体 ListView 不支持嵌入式控件。您可以尝试构建自己的自定义控件,也可以使用 http://www.codeproject.com/KB/list/EXListView.aspx 之类的东西。

【讨论】:

【参考方案7】:

不,是的,ListView 本身不支持这样的功能,但是您可以在其上创建一个按钮,以便它作为列表视图的组成部分向用户显示。 (我想这也是上面提到的 ExtendedListView 所做的)。

【讨论】:

【参考方案8】:

也许值得一提的是,列表视图控件可能在 WPF 中设计为用户控件/自定义控件,其 ListViewItems 中有按钮,然后在 WinForms 应用程序中使用此控件,在 ElementHost 控件中。

【讨论】:

【参考方案9】:

我之前无意中遇到过一个讨论,希望对您有所帮助:http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/ee232cc4-68c5-4ed3-9ea7-d4d999956504/

【讨论】:

【参考方案10】:

您可以使用GlacialList。它允许您将任何控件放在列表单元格中,并且使用起来很简单。您只需将 GlacialList.dll 文档加入解决方案的参考部分。如果您单击该链接,它将向您展示它的工作原理以及如何使用和下载它。

如果您在InitializeComponent() 上有一个System.IO.FileNotFoundException,只需从上面的链接下载源代码,编译并使用这个 .dll(在 bin/Debug 子文件夹中)到您的项目中。

下面是一个例子:

【讨论】:

【参考方案11】:

这看起来像是我遇到的最简单的答案......刚刚在ListView 中添加了一个ItemCommand

查看此链接:handle-the-button-click-event-from-an-asp-net-listview-control

【讨论】:

讨论的是winforms而不是asp.net

以上是关于winform中ListView绑定问题的主要内容,如果未能解决你的问题,请参考以下文章

.NET的winform中listview的绑定

C# winform程序 绑定listView1控件值(对应数据库表中的字段名) 循环绑定 insert into 语句中的到吗问题...

c#winform listview绑定图片

vs2008的c#winform开发,关于listview的数据绑定

wpf,我给一个textbox的text绑定到一个listv.selectionitem.path,

C# Winform 关于ListView控件绑定DataTable