将控件属性(例如颜色)数据绑定到未显示的字段

时间:2015-03-13 11:54:43

标签: c# database winforms data-binding datagridview

我正在使用数据库和数据绑定来完成我的第一步,并且我试图解决一些问题。

在我的Access数据库中,我有一个表(Items),其中包含DescriptionCodeComments等字符串字段。我还有其他布尔字段,例如AvailabilityRelevance

"Items"

|  ID  |  Description  |  Code  |  Comments  |  Availability  |  Relevance  |
|      |               |        |            |                |             |    
|   1  |  Apple        |  AP    |  Red       |        x       |             |
|   2  |  Orange       |  OR    |  Orange    |        x       |       x     |
|   3  |  Banana       |  BN    |  Yellow    |                |       x     |
|   4  |  Lime         |  LM    |  Green     |        x       |             |

我想通过数据绑定在dataGridView中显示部分数据:主要是DescriptionCodeComments

private void DataBindGridView()
    {
        string dbPath = @"C:\FruitDB.accdb";
        string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + dbPath + ";Persist Security Info=False;";

        OleDbConnection dbConn = new OleDbConnection(connStr);
        dbConn.Open();

        string query = "SELECT Description, Code, Comments, FROM Items ORDER BY ID ASC";
        OleDbCommand getItems = new OleDbCommand(query);
        OleDbDataAdapter dbDataAdapter = new OleDbDataAdapter(getItems);

        DataTable itemsTable = new DataTable();
        itemsTable.Locale = System.Globalization.CultureInfo.InvariantCulture;
        dbDataAdapter.SelectCommand.Connection = dbConn;
        dbDataAdapter.Fill(itemsTable);

        // I want my first column to contain a checkbox for other purposes
        // 
        DataGridViewCheckBoxColumn col1 = new DataGridViewCheckBoxColumn(false);
        col1.Name = "Selection";
        col1.HeaderText = "";
        dataGridView1.Columns.Add(col1);

        // Binding the dataGridView
        //
        dataGridView1.ReadOnly = false;
        dataGridView1.DataSource = itemsTable;

        // The user is allowed to edit the checkbox column only
        // 
        foreach (DataGridViewColumn col in dataGridView1.Columns)
        {
            if (col.Index == 0)
            {
                col.ReadOnly = false;
            }
            else
            {
                col.ReadOnly = true;
            }
        }
    }

现在,即使我不想在Availability中将RelevancedataGridView信息显示为单独的列,我也希望将这些信息显示在某些列中其他方式,例如作为删除线字体或将线条颜色设置为灰色。

如何对这些属性进行数据绑定?我是否需要使用另一个不同的查询/命令/ dataTable重复整个事情......?

1 个答案:

答案 0 :(得分:1)

我想你想要这样的东西:

private void dataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (dataGridView.Columns[e.ColumnIndex].Name == "Availability")
        e.CellStyle.ForeColor = Color.Silver;
}

这基本上是绘制所有细胞的基础。 Availability列中的文字为灰色。你可以扩展代码,只是为了证明这个想法。

另外:当然,您应该在SQL中包含额外的列。使用DataGridView来控制它们的外观。您也可以完全隐藏列。