今天,做了一个通过DEVEXPRESS控件GridControl进行数据增、删、改、查操作的一个winform实例,在此做个记录。方便以后查阅。

在程序中用了静态类的集合来模拟,两个类如下:

    public class Boy
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string ImgPath { get; set; }
    }
    public static class BoyLists
    {
        public static List<Boy> boys = new List<Boy>();
    }

程序运行后界面如下图所示:

首先建一个窗体,在窗体中有一个gridcontrol控件用于显示boys列表,还有btn增,btn删、btn改、btn查按钮, txtName和txtAge文本框,用于显示名称和年龄, pictureEdit1用于显示boy图片,btnLoad按钮用于加载图片,pictureEdit1框中的图自动适应图片框的大小 txtPath文本框用于显示图片新生成的文件名,images目录用于读取和写入图片的目录, 图片加载后能够按日期和时间重新命名。 程序运行正常的逻辑是: 输入名称和年龄,然后btnLoad图片,然后点btn增 按钮,添加成功,在列表控件中显示。 在列表控件中单击一行数据,数据分别显示在文本框中,可修改,同时图片也可重新添加。

时同在gridcontrol控件中新增了一列图片,用于显示图片。

下面,我们分别来看代码:

在主窗体的初始化中,执行了以下一些方法:

        public boyForm()
        {
            InitializeComponent();
            gridControl1.DataSource = BoyLists.boys;
            gridView1.SelectionChanged += GridView1_SelectionChanged;
            // 获取GridControl的默认视图

            GridView gridView = gridControl1.MainView as GridView;
            // 添加显示图片的列
            AddImageColumn(gridView);
        }

添加图片的方法如下:

        private void AddImageColumn(GridView gridView)
        {
            // 创建一个新的GridColumn对象
            GridColumn imageColumn = new GridColumn
            {
                FieldName = "ImageColumn", // 这是一个虚拟字段名,因为我们将在自定义绘制中处理图像

                Caption = "图片",
                Visible = true,
                VisibleIndex = gridView.Columns.Count, // 将新列添加到现有列的末尾
                UnboundType = DevExpress.Data.UnboundColumnType.Object // 如果图片数据不是直接来自数据源,则设置为Unbound类型
            };
            // 创建一个RepositoryItemPictureEdit对象来作为图片的编辑器
            // 创建一个RepositoryItemPictureEdit对象来作为图片的编辑器

            RepositoryItemPictureEdit pictureEdit = new RepositoryItemPictureEdit
            {
                SizeMode = DevExpress.XtraEditors.Controls.PictureSizeMode.Stretch, // 设置图片大小模式

                NullText = "无图片", // 当没有图片时显示的文本
                // 可以设置其他属性,如图片的高度、宽度等
            };

            // 将RepositoryItemPictureEdit分配给GridColumn
            imageColumn.ColumnEdit = pictureEdit;

            // 将图片列添加到GridView中
            gridView.Columns.Add(imageColumn);

            // 将图片列添加到GridControl的视图中
            gridView.CustomDrawCell += GridView_CustomDrawCell;

        }

在列表中显示图片:

        private void GridView_CustomDrawCell(object sender, RowCellCustomDrawEventArgs e)
        {
            // 检查是否是我们要自定义绘制的列
            if (e.Column.FieldName == "ImageColumn")
            {
                // 获取当前行的数据对象(这里假设你的数据源是List<Boy>)
                var boy = gridView1.GetRow(e.RowHandle) as Boy;
                if (boy != null && !string.IsNullOrEmpty(boy.ImgPath))
                {
                    // 构造图片的全路径(这里假设图片存放在应用程序的images文件夹下)
                    string fullPath = Path.Combine(Application.StartupPath, "images", boy.ImgPath);

                    if (File.Exists(fullPath))
                    {
                        // 加载图片
                        Image img = Image.FromFile(fullPath);
                        // 绘制图片到单元格中
                        e.Graphics.DrawImage(img, e.Bounds);
                        // 释放图片资源(如果你不打算在之后再次使用它)
                        img.Dispose();
                        // 表示已经自定义绘制了单元格,不需要默认绘制
                        e.Handled = true;
                    }
                }
            }
        }

当选中某行数据时的变化:

        private void GridView1_SelectionChanged(object sender, DevExpress.Data.SelectionChangedEventArgs e)
        {
            // 获取选中的行数据

            var selectedBoy = gridView1.GetFocusedRow() as Boy;
            if (selectedBoy != null)
            {
                // 将选中行的数据加载到文本框和图片控件中
                txtName.Text = selectedBoy.Name;
                txtAge.Text = selectedBoy.Age.ToString();
                txtPath.Text = selectedBoy.ImgPath;

                // 加载图片
                LoadImage(selectedBoy.ImgPath);
            }
        }

加载图片到图片框:

        private void LoadImage(string imgPath)
        {
            if (!string.IsNullOrEmpty(imgPath))
            {
                string fullPath = Path.Combine(Application.StartupPath, "images", imgPath);

                if (File.Exists(fullPath))
                {
                    Image img = Image.FromFile(fullPath);
                    pictureEdit1.Image = img;
                    pictureEdit1.Properties.SizeMode = DevExpress.XtraEditors.Controls.PictureSizeMode.Stretch;
                }
                else
                {
                    pictureEdit1.Image = null;
                }
            }
            else
            {
                pictureEdit1.Image = null;
            }
        }

点击新按钮新增数据:

        private void btn增_Click(object sender, EventArgs e)
        {
            // 验证输入

            if (string.IsNullOrWhiteSpace(txtName.Text) || string.IsNullOrWhiteSpace(txtAge.Text))
            {
                MessageBox.Show("请输入名称和年龄!");
                return;
            }
            // 添加新的Boy对象到列表中
            var newBoy = new Boy
            {
                Name = txtName.Text,
                Age = int.Parse(txtAge.Text),
                ImgPath = txtPath.Text // 这里存储的是相对路径或文件名,根据需要调整
            };
            BoyLists.boys.Add(newBoy);

            // 刷新GridControl以显示新添加的数据
            gridControl1.RefreshDataSource();
        }

删除和修改数据:

        private void btn删_Click(object sender, EventArgs e)
        {
            // 从列表中删除选中的Boy对象

            var selectedBoy = gridView1.GetFocusedRow() as Boy;
            if (selectedBoy != null)
            {
                BoyLists.boys.Remove(selectedBoy);
                gridControl1.RefreshDataSource();
            }
        }

        private void btn改_Click(object sender, EventArgs e)
        {
            // 编辑选中的Boy对象
            var selectedBoy = gridView1.GetFocusedRow() as Boy;
            if (selectedBoy != null)
            {
                selectedBoy.Name = txtName.Text;
                selectedBoy.Age = int.Parse(txtAge.Text);
                // 如果图片已加载,则不需要更改ImgPath
                gridControl1.RefreshDataSource();
            }
        }

加载图片:

        private void btnLoad_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog openFileDialog = new OpenFileDialog())
            {
                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    string filePath = openFileDialog.FileName;
                    txtPath.Text = Path.GetFileName(filePath); // 显示文件名

                    // 加载图片并调整大小
                    Image img = Image.FromFile(filePath);
                    pictureEdit1.Image = img;
                    pictureEdit1.Properties.SizeMode=DevExpress.XtraEditors.Controls.PictureSizeMode.Stretch; // 或其他适当的模式

                    // 复制图片到images目录并重命名
                    string imagesDir = Path.Combine(Application.StartupPath, "images");

                    string newFileName = DateTime.Now.ToString("yyyyMMddHHmmss") + Path.GetExtension(filePath);
                    string newFilePath = Path.Combine(imagesDir, newFileName);
                    File.Copy(filePath, newFilePath, true);
                    // 更新图片路径
                    // 更新当前选中行的图片路径

                    var selectedBoy = gridView1.GetFocusedRow() as Boy;

                    if (selectedBoy != null)
                    {
                        selectedBoy.ImgPath = newFileName;
                        txtPath.Text = newFileName;

                        // 加载新图片到图片控件中
                        LoadImage(newFileName);
                    }
                }
            }
        }

当鼠标点击某行时取得焦点,选中状态:

        private void gridView1_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
        {
            var selectedBoy = gridView1.GetFocusedRow() as Boy;
            if (selectedBoy != null)
            {
                txtName.Text = selectedBoy.Name;
                txtAge.Text = selectedBoy.Age.ToString();

                // 加载并显示图片
                if (!string.IsNullOrEmpty(selectedBoy.ImgPath))
                {
                    string imagePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "images", selectedBoy.ImgPath);
                    if (File.Exists(imagePath))
                    {
                        var image = Image.FromFile(imagePath);
                        pictureEdit1.Image = image;
                    }
                    else
                    {
                        pictureEdit1.Image = null;
                    }
                }
                else
                {
                    pictureEdit1.Image = null;
                }

            }
        }

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐