.net cf 使用listview 显示表格复选框

  在.net cf里,datagrid没有checkbox,但是项目中又确实需要,在网上查了之后,只有使用listview这种方法了,就特意做了一个listview的datagrid形式的表格出来,封装成一个控件使用。控件在显示时,自动按照显示的最长内容的列宽显示。

 

using System;

using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using ZLDrivers;

namespace LZLControls
{
    public partial class ZLListViewGrid : ListView, ISupportInitialize
    {
        public ZLListViewGrid()
        {
            //设置listView的显示属性
            this.View = View.Details;
            this.FullRowSelect = true;
            this.HeaderStyle = ColumnHeaderStyle.Nonclickable;

            InitializeComponent();
        }

        #region 设计组件 ISupportInitialize Members

        void ISupportInitialize.BeginInit()
        {
        }

        void ISupportInitialize.EndInit()
        {
        }

        #endregion

        #region 增加的属性

        private const uint LVM_FIRST = 0x1000;
        private const uint LVM_SETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + 54;
        private const uint LVM_GETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + 55;

        private void SetStyle(uint style, bool enable)
        {
            uint currentStyle = Win32.SendMessage(
              Handle,
              LVM_GETEXTENDEDLISTVIEWSTYLE,
              0,
              0);

            if (enable)
                Win32.SendMessage(
                  Handle,
                  LVM_SETEXTENDEDLISTVIEWSTYLE,
                  0,
                  currentStyle | style);
            else
                Win32.SendMessage(
                  Handle,
                  LVM_SETEXTENDEDLISTVIEWSTYLE,
                  0,
                  currentStyle & ~style);
        }


        private const uint LVS_EX_GRIDLINES = 0x00000001;

        private bool gridLines = true;
        public bool GridLines
        {
            get { return gridLines; }
            set
            {
                gridLines = value;
                SetStyle(LVS_EX_GRIDLINES, gridLines);
            }
        }

        private const uint LVS_EX_DOUBLEBUFFER = 0x00010000;

        private bool doubleBuffering = true;
        public bool DoubleBuffering
        {
            get { return doubleBuffering; }
            set
            {
                doubleBuffering = value;
                SetStyle(LVS_EX_DOUBLEBUFFER, doubleBuffering);
            }
        }


        private const uint LVS_EX_GRADIENT = 0x20000000;

        private bool gradient = false;
        public bool Gradient
        {
            get { return doubleBuffering; }
            set
            {
                gradient = value;
                SetStyle(LVS_EX_GRADIENT, gradient);
            }
        }

        #endregion

        public int CurrentRowIndex
        {
            get
            {
                if (this.FocusedItem == null)
                {
                    return -1;
                }
                else
                {
                    return this.FocusedItem.Index;
                }
            }
            set
            {
                if ( this.Items.Count>0 )
                {
                    if (value < 0)
                    {
                        if ( CurrentRowIndex>=0 )
                        {
                            this.Items[CurrentRowIndex].Selected = false;
                        }
                    }
                    else if ( value<this.Items.Count )
                    {
                        this.Items[value].Selected = true;
                        this.Items[value].Focused = true;
                    }
                    else
                    {
                        throw new Exception("序号不正确!");
                    }
                }
                else
                {
                    throw new Exception("序号不正确!");
                }
                
            }
        }

        private void InsertDetail(ref DataTable dt)
        {
            for (int index = 0; index < dt.Rows.Count; index++)
            {
                ListViewItem item = new ListViewItem();
                item.SubItems[0].Text = dt.Rows[index][0].ToString();   // 这必须给0赋值
                for (int j = 1; j < dt.Columns.Count; j++)
                {
                    item.SubItems.Add(dt.Rows[index][j].ToString());
                }
                this.Items.Add(item);
            }
        }

        public DataTable DataSource
        {
            set
            {
                if (value != null)
                {
                    this.BeginUpdate();
                    AutoAdjushColumnWidth(ref value);
                    InsertDetail(ref value);
                    this.EndUpdate();
                }
                else
                {
                    this.Clear();
                }
            }
        }

        /// <summary>
        /// 自动调整列宽
        /// </summary>
        public void AutoAdjushColumnWidth( ref DataTable dt )
        {
            //if (DataSource != null)
            {
                //DataTable dt = (DataTable)DataSource;
                Graphics g = this.Parent.CreateGraphics();
                int rowsCount = dt.Rows.Count;
                int[] szMaxWidth = new int[dt.Columns.Count];
                SizeF textSize;
                int i, j, nExtendWidth;

                /// 空出一个字符画表格的空间
                nExtendWidth = (int)g.MeasureString("a", this.Font).Width * 2;      // listview与datagrid不一样,范围更大一些

                /// 设置标题列宽
                for (i = 0; i < szMaxWidth.Length; i++)
                {
                    szMaxWidth[i] = (int)g.MeasureString(dt.Columns[i].Caption, this.Font).Width + nExtendWidth;
                }

                /// 获取最大列宽
                for (i = 0; i < rowsCount; i++)
                {
                    for (j = 0; j < szMaxWidth.Length; j++)
                    {
                        textSize = g.MeasureString(dt.Rows[i][j].ToString(), this.Font);
                        if (textSize.Width > szMaxWidth[j])
                        {
                            szMaxWidth[j] = (int)textSize.Width;
                        }
                    }
                }

                if ( CheckBoxes && szMaxWidth.Length>0 )
                {
                    szMaxWidth[0] += nExtendWidth * 1;
                }

                /// 添加字段名
                this.Clear();
                for (i = 0; i < szMaxWidth.Length; i++)
                {
                    this.Columns.Add(dt.Columns[i].ColumnName, szMaxWidth[i] + nExtendWidth, HorizontalAlignment.Left);
                }

                g.Dispose();
            }
        }
    }
}


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值