C# DataGridView 的图像不显示

标签 c# image datagridview

我需要您在这个问题上的专业知识: 我有一个 dataGridView,我用表适配器填充了

public contractManage()
        {
            InitializeComponent();

            try
            {
                this.tblContractsTableAdapter.FillBy(this.tESTDataSet.tblContracts);
            }
            catch (System.Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message);
            }

            //Set color status
            setStatus();

        }

然后我想添加 3 列(在索引 8、9 和 10 上),这些列将根据我数据库中的值显示不同的图像 对于第一列中的每一行,我查询数据库以获取 3 个值 AtrOk 真/假、PrOk 真/假、PoOk 真/假

   public void setStatus()
    {
        SqlConnection conn;

        this.dataGridViewContractManage.AutoGenerateColumns = false;
        this.dataGridViewContractManage.ReadOnly = false;

        //Add images column
        DataGridViewImageColumn icAtr = new DataGridViewImageColumn();
            icAtr.HeaderText = "ATR";
            icAtr.Image = null;
            icAtr.Name = "cImgAtr";
            icAtr.Width = 35;
            icAtr.DefaultCellStyle.NullValue = null;
        this.dataGridViewContractManage.Columns.Add(icAtr);

        DataGridViewImageColumn icPr = new DataGridViewImageColumn();
            icPr.HeaderText = "PR";
            icPr.Image = null;
            icPr.Name = "cImgPr";
            icPr.Width = 35;
            icPr.DefaultCellStyle.NullValue = null;
        this.dataGridViewContractManage.Columns.Add(icPr);

        DataGridViewImageColumn icPo = new DataGridViewImageColumn();
            icPo.HeaderText = "PO";
            icPo.Image = null;
            icPo.Name = "cImgPo";
            icPo.Width = 35;
            icPo.DefaultCellStyle.NullValue = null;
        this.dataGridViewContractManage.Columns.Add(icPo);

        //Browse through dataGridView rows
        foreach (DataGridViewRow row in dataGridViewContractManage.Rows)
        {
            //Capture contract id in first cell
            int id = Convert.ToInt32(row.Cells[0].Value);
            bool atrOk = false;
            bool prOk = false;
            bool poOk = false;

            //Query this id to get atr, pr, po status values
            //Connection string
            conn = sqlDbConnection.GetConnection();

            //Connect
            conn.Open();

            try
            {
                SqlDataReader myReader = null;
                SqlCommand newCmd = new SqlCommand("SELECT * FROM tblContracts WHERE tblContracts.ContractId=" + id, conn);

                myReader = newCmd.ExecuteReader();

                while (myReader.Read())
                {
                    atrOk = Convert.ToBoolean(myReader["AtrOk"]);
                    prOk = Convert.ToBoolean(myReader["PrOk"]);
                    poOk = Convert.ToBoolean(myReader["PoOk"]);
                }

            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
            finally
            {
                //Close DB connection
                conn.Close();
            }

            //MessageBox.Show("# " + id + "\nATR " + atrOk.ToString() + "\nPR " + prOk.ToString() + "\nPO " + poOk.ToString());

            //Set images in dataGridView depending on values
            DataGridViewImageCell cellAtr = row.Cells[8] as DataGridViewImageCell;
            DataGridViewImageCell cellPr = row.Cells[9] as DataGridViewImageCell;
            DataGridViewImageCell cellPo = row.Cells[10] as DataGridViewImageCell;

            cellAtr.ReadOnly = false;
            cellPr.ReadOnly = false;
            cellPo.ReadOnly = false;

            if (atrOk == true)
            {
                cellAtr.Value = (System.Drawing.Image)Properties.Resources.Bullet_Green;

            }
            else
            {
                cellAtr.Value = (System.Drawing.Image)Properties.Resources.Bullet_Red;

            }

            if (prOk == true)
            {
                cellPr.Value = (System.Drawing.Image)Properties.Resources.Bullet_Green;

            }
            else
            {
                cellAtr.Value = (System.Drawing.Image)Properties.Resources.Bullet_Red;

            }

            if (poOk == true)
            {
                cellPo.Value = (System.Drawing.Image)Properties.Resources.Bullet_Green;

            }
            else
            {
                cellAtr.Value = (System.Drawing.Image)Properties.Resources.Bullet_Red; 
            }

        }

        MessageBox.Show("Done");
    }

我不明白为什么,但似乎 DataGridView 填充正确,设置图像列中的图像发送清除它,在每个图像单元格中留下“null”


在 DJ Kraze 发表评论后,我“玩”了连接/关闭(将其移出了循环),但它并没有真正改变任何东西。

绑定(bind)源(我使用 Visual C# GUI 为我完成)在我的 xx.Designer.cs 中定义

partial class contractManage
{
    /// <summary> 
    /// Variable nécessaire au concepteur.
    /// </summary>
    private System.ComponentModel.IContainer components = null;

    /// <summary> 
    /// Nettoyage des ressources utilisées.
    /// </summary>
    /// <param name="disposing">true si les ressources managées doivent être supprimées ; sinon, false.</param>
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    #region Code généré par le Concepteur de composants

    /// <summary> 
    /// Méthode requise pour la prise en charge du concepteur - ne modifiez pas 
    /// le contenu de cette méthode avec l'éditeur de code.
    /// </summary>
    private void InitializeComponent()
    {
        this.components = new System.ComponentModel.Container();
        System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
        System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle();
        this.tESTDataSet = new BombardierEngAdmin.TESTDataSet();
        this.tblContractsTableAdapter = new BombardierEngAdmin.TESTDataSetTableAdapters.tblContractsTableAdapter();
        this.dataGridViewContractManage = new System.Windows.Forms.DataGridView();
        this.tblContractsBindingSource = new System.Windows.Forms.BindingSource(this.components);
        this.agencyDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
        this.endDateDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
        this.startDateDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
        this.contractTypeDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
        this.surnameDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
        this.firstNameDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
        this.contractStatusDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewImageColumn();
        this.contractIdDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
        ((System.ComponentModel.ISupportInitialize)(this.tESTDataSet)).BeginInit();
        ((System.ComponentModel.ISupportInitialize)(this.dataGridViewContractManage)).BeginInit();
        ((System.ComponentModel.ISupportInitialize)(this.tblContractsBindingSource)).BeginInit();
        this.SuspendLayout();
        // 
        // tESTDataSet
        // 
        this.tESTDataSet.DataSetName = "TESTDataSet";
        this.tESTDataSet.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
        // 
        // tblContractsTableAdapter
        // 
        this.tblContractsTableAdapter.ClearBeforeFill = true;
        // 
        // dataGridViewContractManage
        // 
        this.dataGridViewContractManage.AllowUserToAddRows = false;
        this.dataGridViewContractManage.AllowUserToDeleteRows = false;
        this.dataGridViewContractManage.AllowUserToResizeRows = false;
        this.dataGridViewContractManage.AutoGenerateColumns = false;
        this.dataGridViewContractManage.BackgroundColor = System.Drawing.Color.White;
        this.dataGridViewContractManage.BorderStyle = System.Windows.Forms.BorderStyle.None;
        this.dataGridViewContractManage.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single;
        dataGridViewCellStyle1.Font = new System.Drawing.Font("Segoe UI", 8F);
        this.dataGridViewContractManage.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1;
        this.dataGridViewContractManage.ColumnHeadersHeight = 25;
        this.dataGridViewContractManage.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
        this.dataGridViewContractManage.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
        this.contractIdDataGridViewTextBoxColumn,
        this.contractStatusDataGridViewTextBoxColumn,
        this.firstNameDataGridViewTextBoxColumn,
        this.surnameDataGridViewTextBoxColumn,
        this.contractTypeDataGridViewTextBoxColumn,
        this.startDateDataGridViewTextBoxColumn,
        this.endDateDataGridViewTextBoxColumn,
        this.agencyDataGridViewTextBoxColumn});
        this.dataGridViewContractManage.DataSource = this.tblContractsBindingSource;
        dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
        dataGridViewCellStyle2.BackColor = System.Drawing.SystemColors.Window;
        dataGridViewCellStyle2.Font = new System.Drawing.Font("Segoe UI", 8F);
        dataGridViewCellStyle2.ForeColor = System.Drawing.SystemColors.ControlText;
        dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight;
        dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
        dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
        this.dataGridViewContractManage.DefaultCellStyle = dataGridViewCellStyle2;
        this.dataGridViewContractManage.EnableHeadersVisualStyles = false;
        this.dataGridViewContractManage.GridColor = System.Drawing.Color.Gainsboro;
        this.dataGridViewContractManage.Location = new System.Drawing.Point(4, 4);
        this.dataGridViewContractManage.Name = "dataGridViewContractManage";
        this.dataGridViewContractManage.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single;
        this.dataGridViewContractManage.RowHeadersDefaultCellStyle = dataGridViewCellStyle1;
        this.dataGridViewContractManage.RowHeadersVisible = false;
        this.dataGridViewContractManage.RowHeadersWidth = 20;
        this.dataGridViewContractManage.RowTemplate.ReadOnly = true;
        this.dataGridViewContractManage.RowTemplate.Resizable = System.Windows.Forms.DataGridViewTriState.False;
        this.dataGridViewContractManage.Size = new System.Drawing.Size(897, 502);
        this.dataGridViewContractManage.TabIndex = 1;
        this.dataGridViewContractManage.CellContentDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridViewContractManage_CellContentDoubleClick);
        // 
        // tblContractsBindingSource
        // 
        this.tblContractsBindingSource.DataMember = "tblContracts";
        this.tblContractsBindingSource.DataSource = this.tESTDataSet;
        // 
        // agencyDataGridViewTextBoxColumn
        // 
        this.agencyDataGridViewTextBoxColumn.DataPropertyName = "Agency";
        this.agencyDataGridViewTextBoxColumn.HeaderText = "Agency";
        this.agencyDataGridViewTextBoxColumn.Name = "agencyDataGridViewTextBoxColumn";
        this.agencyDataGridViewTextBoxColumn.Width = 150;
        // 
        // endDateDataGridViewTextBoxColumn
        // 
        this.endDateDataGridViewTextBoxColumn.DataPropertyName = "EndDate";
        this.endDateDataGridViewTextBoxColumn.HeaderText = "End";
        this.endDateDataGridViewTextBoxColumn.Name = "endDateDataGridViewTextBoxColumn";
        this.endDateDataGridViewTextBoxColumn.Width = 80;
        // 
        // startDateDataGridViewTextBoxColumn
        // 
        this.startDateDataGridViewTextBoxColumn.DataPropertyName = "StartDate";
        this.startDateDataGridViewTextBoxColumn.HeaderText = "Start";
        this.startDateDataGridViewTextBoxColumn.Name = "startDateDataGridViewTextBoxColumn";
        this.startDateDataGridViewTextBoxColumn.Width = 80;
        // 
        // contractTypeDataGridViewTextBoxColumn
        // 
        this.contractTypeDataGridViewTextBoxColumn.DataPropertyName = "ContractType";
        this.contractTypeDataGridViewTextBoxColumn.HeaderText = "Type";
        this.contractTypeDataGridViewTextBoxColumn.Name = "contractTypeDataGridViewTextBoxColumn";
        this.contractTypeDataGridViewTextBoxColumn.Width = 150;
        // 
        // surnameDataGridViewTextBoxColumn
        // 
        this.surnameDataGridViewTextBoxColumn.DataPropertyName = "Surname";
        this.surnameDataGridViewTextBoxColumn.HeaderText = "Surname";
        this.surnameDataGridViewTextBoxColumn.Name = "surnameDataGridViewTextBoxColumn";
        // 
        // firstNameDataGridViewTextBoxColumn
        // 
        this.firstNameDataGridViewTextBoxColumn.DataPropertyName = "FirstName";
        this.firstNameDataGridViewTextBoxColumn.HeaderText = "FirstName";
        this.firstNameDataGridViewTextBoxColumn.Name = "firstNameDataGridViewTextBoxColumn";
        // 
        // contractStatusDataGridViewTextBoxColumn
        // 
        this.contractStatusDataGridViewTextBoxColumn.DataPropertyName = "ContractStatus";
        this.contractStatusDataGridViewTextBoxColumn.HeaderText = "Status";
        this.contractStatusDataGridViewTextBoxColumn.Name = "contractStatusDataGridViewTextBoxColumn";
        this.contractStatusDataGridViewTextBoxColumn.Resizable = System.Windows.Forms.DataGridViewTriState.True;
        this.contractStatusDataGridViewTextBoxColumn.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic;
        this.contractStatusDataGridViewTextBoxColumn.Width = 35;
        // 
        // contractIdDataGridViewTextBoxColumn
        // 
        this.contractIdDataGridViewTextBoxColumn.DataPropertyName = "ContractId";
        this.contractIdDataGridViewTextBoxColumn.HeaderText = "#";
        this.contractIdDataGridViewTextBoxColumn.Name = "contractIdDataGridViewTextBoxColumn";
        this.contractIdDataGridViewTextBoxColumn.ReadOnly = true;
        this.contractIdDataGridViewTextBoxColumn.Width = 50;
        // 
        // contractManage
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.BackColor = System.Drawing.Color.White;
        this.Controls.Add(this.dataGridViewContractManage);
        this.Name = "contractManage";
        this.Size = new System.Drawing.Size(921, 526);
        ((System.ComponentModel.ISupportInitialize)(this.tESTDataSet)).EndInit();
        ((System.ComponentModel.ISupportInitialize)(this.dataGridViewContractManage)).EndInit();
        ((System.ComponentModel.ISupportInitialize)(this.tblContractsBindingSource)).EndInit();
        this.ResumeLayout(false);

    }

    #endregion

    private TESTDataSet tESTDataSet;
    private TESTDataSetTableAdapters.tblContractsTableAdapter tblContractsTableAdapter;
    private System.Windows.Forms.DataGridView dataGridViewContractManage;
    private System.Windows.Forms.DataGridViewTextBoxColumn contractIdDataGridViewTextBoxColumn;
    private System.Windows.Forms.DataGridViewImageColumn contractStatusDataGridViewTextBoxColumn;
    private System.Windows.Forms.DataGridViewTextBoxColumn firstNameDataGridViewTextBoxColumn;
    private System.Windows.Forms.DataGridViewTextBoxColumn surnameDataGridViewTextBoxColumn;
    private System.Windows.Forms.DataGridViewTextBoxColumn contractTypeDataGridViewTextBoxColumn;
    private System.Windows.Forms.DataGridViewTextBoxColumn startDateDataGridViewTextBoxColumn;
    private System.Windows.Forms.DataGridViewTextBoxColumn endDateDataGridViewTextBoxColumn;
    private System.Windows.Forms.DataGridViewTextBoxColumn agencyDataGridViewTextBoxColumn;
    private System.Windows.Forms.BindingSource tblContractsBindingSource;
}
}

最佳答案

您的代码的问题在于您将图像分配给了错误的属性。您应该设置 Image 属性而不是 Value 属性。

获得空值的原因是,当您创建列时,将 Image 属性设置为空,然后从不更改它。

** 编辑 **

尝试这样做。我刚刚做到了,以便每个对象的创建都在相同的上下文中。

        if (atrOk == true)
        {
            DataGridViewImageCell cellAtr = row.Cells[8] as DataGridViewImageCell;
            cellAtr.Value = (System.Drawing.Image)Properties.Resources.Bullet_Green;

        }
        else
        {
            DataGridViewImageCell cellAtr = row.Cells[8] as DataGridViewImageCell;
            cellAtr.Value = (System.Drawing.Image)Properties.Resources.Bullet_Red;

        }

        if (prOk == true)
        {
            DataGridViewImageCell cellPr = row.Cells[9] as DataGridViewImageCell;
            cellPr.Value = (System.Drawing.Image)Properties.Resources.Bullet_Green;

        }
        else
        {
            DataGridViewImageCell cellAtr = row.Cells[8] as DataGridViewImageCell;
            cellAtr.Value = (System.Drawing.Image)Properties.Resources.Bullet_Red;

        }

        if (poOk == true)
        {
            DataGridViewImageCell cellPo = row.Cells[10] as DataGridViewImageCell;
            cellPo.Value = (System.Drawing.Image)Properties.Resources.Bullet_Green;

        }
        else
        {
            DataGridViewImageCell cellAtr = row.Cells[8] as DataGridViewImageCell;
            cellAtr.Value = (System.Drawing.Image)Properties.Resources.Bullet_Red; 
        }

关于C# DataGridView 的图像不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14813846/

相关文章:

c# - Silverlight:在何处存储跨页面使用的数据

java - 从图库中选取图像时出现 FileNotFoundException

python - 使用 python(字节数组和 numpy)读取 middlebury 'flow' 文件

c# - 防止在应用程序的单独实例之间进行拖放操作

c# - Winforms - 将新表单直接定位在 Datagridview 选定的父行下

c# - 如何更改点光源内 'Draw Halo'的值-Unity3D

c# - 检查玩家在潜行游戏中的亮度

file - 如何存储数百万张大小约为 2k 的图片

c# - 自定义 DataGridViewCheckBoxCell 视觉更新在编辑模式下不起作用

c# - 删除字节数组中的前导 0