1. 程式人生 > >關於DataGrid的一點基礎東西

關於DataGrid的一點基礎東西

1、列名顯示
MS讓DataGrid的外觀配置,包括列名的顯示,全部交給了GridTableStylesCollection。
DataGridTableStyle是一個DataGridTableStyle集合,由MappingName確定唯一性。
而GridColumnStyles 屬性確定其中列的具體情況,也是一個集合。
列的屬性可以為DataGridBoolColumn或者DataGridTextBoxColumn,常用後者。
列同樣有由MappingName確定其唯一性,在DataSet/DataTable中,與其中的ColumnName對應。
DataGridTextBoxColumn.HeaderText就是列名的顯示值。
還有其他許多很有用的屬性。
但是:我用Delphi的時候,從來沒碰到要設定一下列名這麼簡單的事情竟然需要這麼複雜的過程,我根本沒想到去用其他的屬性……
另外,不是有DataTable.Columns.Caption麼?為何DataGrid死抓住ColumnName不放而不去看看Caption?
程式碼:
command = conn.CreateCommand();
command.CommandText = "Select ID, NAME,REMARK From TBL;";
command.CommandType = CommandType.Text;
DataTable table = new DataTable();
adapter = new FbDataAdapter(command);
adapter.Fill(table);

table.TableName = "TBL";        //其實table原來的TableName為空
grid.DataSource = table;
DataGridTableStyle ts = new DataGridTableStyle();
DataGridTextBoxColumn t1 = new DataGridTextBoxColumn() ,
        t2 = new DataGridTextBoxColumn() ,
        t3 = new DataGridTextBoxColumn();
ts.MappingName = table.TableName;
t1.MappingName = "ID"; t1.HeaderText = "編號";
t1.NullText = "自動編號";
t2.MappingName = "NAME"; t2.HeaderText = "名稱";
t2.NullText     = "";
t3.MappingName = "REMARK"; t3.HeaderText = "備註";
t3.NullText = "";
ts.GridColumnStyles.Add(t1);
ts.GridColumnStyles.Add(t2);
ts.GridColumnStyles.Add(t3);
grid.TableStyles.Add(ts);

2、選擇行
找到了選擇行的一個好程式碼,利用了DataGridTextBoxColumn.TextBox.Enter屬性。
主要是把選擇做成了一個事件,極為方便呼叫,我稍微改了一下,放到了我的公用類裡了(所以需要static)。
使用時直接把selectLineInit放到Form的OnLoad裡面就行了:
public static void selectLineInit(DataGridTableStyle ts)
{
        foreach (DataGridColumnStyle dgCol in ts.GridColumnStyles)
        {
                DataGridTextBoxColumn dgtCol = dgCol as DataGridTextBoxColumn;
                dgtCol.TextBox.Enter += new EventHandler( onSelectLine);
        }
}

public static void onSelectLine( object sender, EventArgs e)
{
        Control txtContentBox = sender as Control;
        txtContentBox.Visible = false;
        DataGrid dgParent = txtContentBox.Parent as DataGrid;
        dgParent.Select(dgParent.CurrentCell.RowNumber);
}