winforms 如何将资源映像自动调整到datagridview列中

bwntbbo3  于 2023-02-24  发布在  其他
关注(0)|答案(3)|浏览(143)

我的资源有Status_Active和Status_Inactive,这是两个48x48的按钮,颜色为绿色和红色,用于显示用户状态。数据网格视图有2列,一个文本框和一个图像列。
主应用程序返回一个错误,试图获取int32.Height和int32.Width(我猜是图像的)。
我已经尝试过将ImageLayout设置为Center来适应它。

var employees = db.Employees.ToList();
        // Add a row for each employee
        foreach (var employee in employees)
        {
            using (Image statusIcon = employee.IsActive ? Resources.Status_Active : Resources.Status_Inactive)
            {
                string fullName = employee.LastName + ", " + employee.FirstName;
                dgvStatustableau.Rows.Add(fullName, statusIcon);
            }
        }`

如何使图像自动适应列?例如16x16或32x32px。GetInt32.Width()GetInt32.Height()用于图像列的目的是什么?

dgjrabp2

dgjrabp21#

您提到您将ImageMode设置为Center,并且您可能希望使用Stretch

我复制了您的帖子,其中两个嵌入的48 x 48图像是表示绑定数据集中的行的类的一部分,并被强制到32 x 32显示区域:

class Employee : INotifyPropertyChanged
{
    public Employee()
    {
        ensureImages();
        Image = _imageInactive;
    }

    public string FullName { get; set; }
    public Image Image
    {
        get => _image;
        set
        {
            if (!Equals(_image, value))
            {
                _image = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Image)));
            }
        }
    }
    Image _image = null;

    [Browsable(false)]
    public bool IsActive
    {
        get => _isActive;
        set
        {
            if (!Equals(_isActive, value))
            {
                _isActive = value;
                Image = _isActive ? _imageActive : _imageInactive;
            }
        }
    }
    bool _isActive = false;

    private void ensureImages()
    {
        if(_imageActive == null) 
        {
            var names = typeof(Employee).Assembly.GetManifestResourceNames();
            _imageActive = localImageFromResourceName(names.First(_=>_.Contains("active.png")));
            _imageInactive = localImageFromResourceName(names.First(_ => _.Contains("inactive.png")));

            Image localImageFromResourceName(string resource)
            {
                using (var stream = GetType().Assembly.GetManifestResourceStream(resource)!)
                {
                    return new Bitmap(stream);
                }
            }
        }
    }
    private static Image _imageActive = null;
    private static Image _imageInactive = null;
    public event PropertyChangedEventHandler PropertyChanged;
}

主窗体

主表单格式化DataGridView并模拟数据库读取数据的位置(因为数据库不是问题的一部分)。

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
        dgvStatustableau.DataSource = Employees;
        dgvStatustableau.AllowUserToAddRows= false;

        #region F O R M A T    C O L U M N S
        Employees.Add(new Employee());
        DataGridViewColumn column;
        column = dgvStatustableau.Columns[nameof(Employee.FullName)];
        column.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

        column = dgvStatustableau.Columns[nameof(Employee.Image)];
        column.HeaderText= string.Empty;
        column.Width = 32;
        // Use Stretch here
        ((DataGridViewImageColumn)column)
        .ImageLayout = DataGridViewImageCellLayout.Stretch;
        Employees.Clear();
        #endregion F O R M A T    C O L U M N S

        mockAddEmployees();
    }
    private BindingList<Employee> Employees { get; } = new BindingList<Employee>();

    private void mockAddEmployees()
    {
        Employees.Add(new Employee
        {
            FullName= "Lisa Smith",
            IsActive= true,
        });
        Employees.Add(new Employee
        {
            FullName= "Bob Jones",
            IsActive= false,
        });
        Employees.Add(new Employee
        {
            FullName= "Rene Montoya",
            IsActive= true,
        });
    }
}
fykwrbwg

fykwrbwg2#

我可以通过调整图标的大小来绘制一个新的位图。

Bitmap resizedIcon = new Bitmap(16, 16);
                    using (Graphics g = Graphics.FromImage(resizedIcon))
                    {
                        g.DrawImage(statusIcon, new Rectangle(0, 0, 16, 16));
                    }
uxh89sit

uxh89sit3#

DataGridViewImageColumn具有ImageLayout属性,支持正常、拉伸和缩放:

  • 正常:图像居中并以原始大小显示。
  • 拉伸:图像会拉伸或收缩以适合单元格的宽度和高度。
  • 缩放:图像均匀地放大或缩小,直到充满单元格的宽度或高度。

根据您的问题,您似乎对“缩放”感兴趣。因此,只需分配所需的任何图像,然后将列的ImageLayout属性设置为“缩放”。

相关问题