2

我需要你在这个问题上的专业知识:我有一个 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 上),这将根据我在数据库中的值显示不同的图像对于每一行我在第一列中有我的记录 ID,我查询我的数据库以获得 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 发表评论后,我已经“玩”了连接/关闭(将其移出循环),但它并没有真正改变任何东西。

绑定源(我使用 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;
}
}
4

1 回答 1

2

您的代码的问题在于您将图像分配给了不正确的属性。您应该设置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; 
        }
于 2013-02-11T15:04:25.360 回答