轉帖|其它|編輯:郝浩|2011-04-14 13:25:56.000|閱讀 1066 次
概述:最近做了一些銀光的項目,剛好用到DataGrid控件,因此這里做個小小的總結,如有不同意見的,歡迎拍磚!!
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
最近做了一些銀光的項目,剛好用到DataGrid控件,因此這里做個小小的總結,如有不同意見的,歡迎拍磚!!
首先,我們第一個遇到的問題,就是怎么讓數據顯示在DataGrid控件的行列中,它又是怎么按照我們的要求顯示的呢
別急;先看下前臺的數據綁定代碼
<sdk:DataGrid Name="datagrid1" IsReadOnly="True"
AutoGenerateColumns="False" />
<sdk:DataGrid.Columns>
<sdk:DataGridTextColumn Header="編號"
Width="80" Binding="{Binding num,Mode=TwoWay}" />
<sdk:DataGridTextColumn Header="姓名"
Width="80" Binding="{Binding name,Mode=TwoWay}" />
<sdk:DataGridTextColumn Header="年齡"
Width="80" Binding="{Binding year,Mode=TwoWay}" />
</sdk:DataGrid.Columns>
</sdk:DataGrid>
首先看到兩個最常用的屬性:
IsReadOnly="True" : 獲取或設置一個值,該值指示用戶是否可以編輯控件中的值 ;當它的值為True時,說明DataGrid就只讀
AutoGenerateColumns="False" :獲取或設置一個值,該值指示在設置 ItemsSource 屬性時是否自動創建列;當它的值為false時,就不自動創建列,也就是按照“編號”,“姓名”,“年齡” 創建三個列;當它的值為true時,就是會自動創建列,也就生成“編號”,“姓名”,“年齡”,“num”,“name”,“year” 創建六個列,因此 初學者,要注意這個細節
接下來就是數據綁定了
Header=“姓名”,表示要在datagrid列中要顯示的 列名 ;
Binding="{Binding name,Mode=TwoWay} ,這里有個 Binding name ,不知道 大家想過沒有 這個name是 怎么來的,它又是怎么把數據顯示在 對應的列中去的
我們再看看 DataGrid給我們的接口 ItemsSource 的類型:System.Collections. IEnumerable
用于生成控件的內容的集合。默認值為 null
也就是說 DataGrid控件提供的是一個 接口 接口的泛形版本, System.Collections.Generic. IEnumerable< T>
看到這里,我們就想到了,只要我們提供一個泛型的類(如:List<類>數組),將這個數組,賦值給 ItemsSource
可是,數組對應的應該是 一行一行的,它又是怎么跟DataGrid 的列對應起來的呢
大家應該看到 List<類>數組,我這里寫著是一個 “類” 字,而不是 string 等常見的類型
也就是說,dataGrid 每一行 就是等價對應著 一個 類 對象,這樣來想的話, 列名 其實就是類 的屬性
這樣就可以理解 Binding="{Binding name,Mode=TwoWay} 中 name 是什么意思,其實它就是 類中的屬性
先定義一個類:
public class People
{
public string num
{
get;
set;
}
public string name
{
get;
set;
}
public string year
{
get;
set;
}
}
大家想一想為什么賦于 {get;set;} 權限呢?
因為datagrid控件,是對數據進行可讀,可寫;如果沒有 賦予 {get;set;}權限 或者 將類 定義為 private
這樣數據將會顯示不出來
對 數組初始化
List<People> ListUsers =new List<People>
{
new People{num= "1",name="張三",year="19"},
new People{num= "2",name="李四",year="25"},
new People{num= "3",name="王五",year="30"}
};
//將數組賦值為 DataGrid 控件
this.datagrid1.ItemsSource = ListUsers;
好了,完成了 第一步,已經可以把數據顯示出來了
接下來,我們要怎么樣對數據進行 增刪改 操作呢?
在增刪改的時候,我們遇到一個 問題,就是 怎么對數據 進行 全選 跟 全不選 ;當時做這個時候 遇到很多問題, google 中顯示很多人 都是用內置 checkbox 來做的,這個根本就不是我們想要的效果
終于在摸索一段時間后,知道一點就是
按照 MVVM 的思想,在 ListBox 和 DataGrid 中并不建議直接去訪問用于綁定顯示的控件,能通過 DataContext 的Model 去訪問的,盡量通過 Model 去解決
也就是說,我們要對 數據進行操作的話,最好就是 通過對 Model 操作 然后重新 綁定 刷新 就達到我們要的效果
所以 ,我們可以這樣達到 全選,全不選的效果
//循環遍歷 DataGrid 的數據源 ,將Item加入到SelectedItems 達到全選的效果
foreach (object o in datagrid1.ItemsSource)
{
datagrid1.SelectedItems.Add(o);
//當要全不選 的時候,只要把 SelectedItems數組清空掉就可以
datagrid1.SelectedItems.Clear();
有了 全選的 ,接下來就可以做 刪除 操作了, 我們刪除的 肯定是 DataGrid 中選擇的行,不管選擇多少行,或者按 Ctrl 鍵 選擇 其中的某幾行,數據;選中的行列 都存儲在 datagrid1.SelectedItems 數組中,因此我們只要對 這個數組 進行循環,刪除到原 Model數組 就可以達到效果
if (list.Count > datagrid1.SelectedItems.Count)
{
for (int i = 0; i < datagrid1.SelectedItems.Count; i++)
{
People people = datagrid1.SelectedItems[0] as People;
list.Remove(people);
}
}
else
{
list.Clear();
}
增加 操作,只要增加一個 空的對象,加入到數組,更新數據源
People people = new People();
list.Add(people);
//更新數據源
Update(list);
修改 操作 ,只要將 IsReadOnly 為 false 即可
datagrid1.IsReadOnly = false;
通過這樣一系列 基本上對 DataGrid 控件 的操作
如果想要將 DataGrid 的數據導入到 數據庫 等等
只需對 數組 進行操作即可,這個就不詳談了
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:zhuimeng11025