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