2013-03-13 39 views
0

我正在创建一个数据网格并将其绑定到数据源,其中一列需要以无法用SQL查询完成的方式生成数据。将虚拟数据网格列添加到压缩框架?

是否有可能创建一个只是空白的虚拟列,我可以重写OnPaint函数以确保它绘制我想要的正确数据?我尝试添加一个没有映射名称的列,但是不会渲染。

+1

我想补充一点,提供了数据源,包括额外的列层。数据源可以看作是一个集合。收集可以填充来自不同来源的数据。由于CF上的数据网格不支持就地编辑,因此编写单向(只读)集合的图层应该很容易。 – josef 2013-03-13 05:26:11

+0

例如,使用数据表,用数据库的数据填充该表,并为计算的数据添加一列。然后使用该数据表作为DataSource的DataSource。 – josef 2013-03-13 05:32:01

回答

2

就像约瑟夫在评论中说的那样,这只是一个添加列的问题。

这个例子会更好,如果GetTableMethod被链接到你的数据层,但它应该得到跨越点:

private const string sqlConnString = "Data Source=myServerAddress;Initial Catalog=myDataBase;Integrated Security=SSPI;" + 
    "User ID=myDomain\myUsername;Password=myPassword;"; 
DataGrid dataGrid1; 

private void BindData() { 
    var table = GetTableMethod("SELECT * FROM Employees;"); 
    var cInt = table.Columns.Add("My Integer", typeof(int)); 
    var cStr = table.Columns.Add("Hex View", typeof(string)); 
    var cBool = table.Columns.Add("Is Even", typeof(bool)); 
    var dDbl = table.Columns.Add("My Double", typeof(double)); 
    for (int i = 0; i < table.Rows.Count; i++) { // can't use a foreach here 
    DataRow row = table.Rows[i]; 
    row[cInt] = i; 
    row[cStr] = i.ToString("X"); // view in hexadecimal, just for fun 
    row[cBool] = ((i % 2) == 0); 
    row[dDbl] = (double)i/table.Rows.Count; 
    } 
    dataGrid1.DataSource = table; 
} 

private DataTable GetTableMethod(string sqlSelectText) { 
    var table = new DataTable(); 
    using (var cmd = new System.Data.SqlClient.SqlCommand(sqlSelectText, new System.Data.SqlClient.SqlConnection(sqlConnString))) { 
    try { 
     cmd.Connection.Open(); 
     table.Load(cmd.ExecuteReader()); 
    } finally { 
     cmd.Connection.Close(); 
    } 
    } 
    return table; 
}