0

我正在尝试从 2 个不同的数据源以编程方式构建 DataGrid。我有一个列表和一个数据网格。问题不在于我的数据处理,而在于 DataGridViewRow 对象的值。这是我的代码:

    protected void buildGrid()
    {
        dgResults.Columns.Add( "sku", "SKU" );
        dgResults.Columns.Add( "itemID", "Item ID" );
        dgResults.Columns.Add( "productName", "Product Name" );
        dgResults.Columns.Add( "eBayQty", "eBay Qty" );
        dgResults.Columns.Add( "stockQty", "Stock Qty" );
        dgResults.Columns.Add( "difference", "Difference" );

        //Add the eBayItem data to the table
        foreach ( string[] eBayItem in ebayItems )
        {
            string SKU = eBayItem[1].ToString();
            int eBayQty = Convert.ToInt32(eBayItem[2]);
            string ProductName = "";
            int stockQty = 0;
            int qtyDifference = 0;

            DataRow[] rows = dbData.Select( "sku ='" + SKU + "'" );
            if (rows.Length == 1) {
                stockQty = Convert.ToInt32( rows[0]["quantity"] );
                ProductName = rows[0]["ProductName"].ToString();
            }
            qtyDifference = stockQty - eBayQty;

            DataGridViewRow dgvr = new DataGridViewRow();
            dgvr.SetValues( SKU, eBayItem[0].ToString(), ProductName, eBayQty, stockQty, qtyDifference );

            if ( qtyDifference != 0 || eBayQty > stockQty )
            {
                dgvr.DefaultCellStyle.BackColor = System.Drawing.Color.Red;
                dgvr.DefaultCellStyle.ForeColor = System.Drawing.Color.White;
            }
            else if ( stockQty > eBayQty )
                dgvr.DefaultCellStyle.BackColor = System.Drawing.Color.LightGoldenrodYellow;
            else
                dgvr.DefaultCellStyle.BackColor = System.Drawing.Color.GreenYellow;

            dgResults.Rows.Add(dgvr);
        }
    }

这些行正在添加到 DataGrid 并且它们被适当地着色,但是行中的每个单元格都不包含数据?我最终得到的只是几个设置了背景属性的空白行。

有人有任何想法吗?

提前致谢。

4

2 回答 2

0

尝试在 DataGridViewRow 上使用 BeginEdit 和 EndEdit

于 2013-02-22T10:54:48.300 回答
0

这是我对执行此类操作的解决方案的看法。

出于演示目的,我构建了一个 EbayItem 类:-

public class EbayItem
    {

        public EbayItem()
        {

        }

        public EbayItem(string sku, int id, string product, int ebayqty, int stockqty)
        {
            SKU = sku;
            ID = id;
            ProductName = product;
            ebayQty = ebayqty;
            stockQty = stockqty;

        }
        public string SKU { get; set; }
        public int ID { get; set; }
        public string ProductName { get; set; }
        public int ebayQty { get; set; }
        public int stockQty { get; set; }
        public int difference
        {

            get { return stockQty - ebayQty; }
            set { difference =  value; }
        }

    }

在 Windows Form(Form1_Load) 中,我创建了一些测试条目并将它们添加到 List 对象中。最后一个条目看起来要购买 2 个手榴弹,但库存为零:-

List<EbayItem> Inventory = new List<EbayItem>();

Inventory.Add(new EbayItem("SKU1", 1, "Ski-Mask", 1, 10));
Inventory.Add(new EbayItem("SKU2", 2, "Shotgun", 1, 10));
Inventory.Add(new EbayItem("SKU3", 3, "Rounds", 5, 10));
Inventory.Add(new EbayItem("SKU4", 4, "Grenade", 2, 0));

我将创建一个 BindingSource 并用我的 Inventory 填充它,而不是手动向我的 DataGridView 添加行:-

BindingSource bs = new BindingSource(Inventory, null);

接下来,为我的 DGV 分配数据源,将其设置为 Binding 对象。这意味着对列表对象所做的任何更改都会自动波及 DGV:-

dataGridView1.DataSource = bs;

现在剩下的就是利用 DGV 的 CellFormatting 事件句柄。我用它来突出显示库存差异为零或更少的任何行:-

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            int colIndex = e.ColumnIndex;
            int rowIndex = e.RowIndex;

            if (rowIndex >= 0 && colIndex >= 0)
            {
                DataGridViewRow theRow = dataGridView1.Rows[rowIndex];

                int difference = (int)theRow.Cells[5].Value;

                if (difference <= 0)
                {
                    theRow.DefaultCellStyle.BackColor = System.Drawing.Color.Red;
                    theRow.DefaultCellStyle.ForeColor = System.Drawing.Color.White;
                }
            }

        }

希望这可以帮助。

于 2013-02-22T13:00:37.943 回答