改變DataGrid單元格顏色

2021-07-13 22:41:33 字數 2095 閱讀 4243

wpf中經常使用datagrid來顯示**資料,我的做法是把資料先放在乙個datatable中,然後再繫結到datagrid中,以後要讀寫資料就直接操作datatable,datagrid僅僅是乙個顯示容器。

繫結**:

datagrid.itemssource = datatable.defaultview;
datagrid的datarowloading事件中,可以改變某一行的整體顏色,但是現在我希望datagrid中的文字能夠按照一定的規則顯示不同的顏色,每一列都有自己的規則,例如第一列的資料大於100為紅色,小於60為藍色,否則為綠色;第二列的資料大於200為紅色,小於160為藍色,否則為綠色。這又該怎麼做呢?

這需要從imultivalueconverter派生乙個類,定義顏色的規則,然後在xaml中將每一列的單元樣式製作好,並傳入必要的列引數,最後在datarowloading時用後台**將datagrid的列樣式指定(因為datagrid的內容是後台動態載入的,因此必須動態指定樣式)。

1、imultivalueconverter派生類

public class datagridvalueconvertermulti : imultivalueconverter

public object convertback(object value, type targettype, object parameter, cultureinfo culture)

}

先不急研究此**,結合xaml中的樣式看看。

2、xaml中定義的樣式

請注意也是在xaml中定義的

我給這個來自「local命名空間」的類datagridvalueconvertermulti取了乙個key,以便於在定義datagridcell樣式的時候進行指定。意思就是datagridcell的樣式中使用了乙個multibinding,而該binging的轉換器,就是第一步在後台**中派生的類datagridvalueconvertermulti。請注意類中的第乙個函式:

public object convert(object value, type targettype, object parameter, cultureinfo culture)
xaml中的weight就是傳入該函式的第三個引數object parameter, xaml中還繫結了兩個path,重量和樣品牌號,一定是在datagrid中存在的列名,並把對應的資料傳入convert的第乙個引數object value中。為什麼要傳入兩個path呢,第乙個重量是指當前單元格的值,而第二個樣品牌號是我用來計算顏色規則的引數。

3、將datagrid的cellstyle指定為xaml中定義的style

在後台datarowloading中加入類似下面的**:

dg.columns[0].cellstyle = (style)findresource("datagridcolumnstylemulti重量");
目的是對dg的列進行cellstyle指定,因為我的後台資料是動態繫結到datagrid中的,所以只能在datarowloading是進行樣式指定。

4、總結

以上描述的方法中,datagrid存在兩個列:重量和樣品牌號,我希望重量列的所有內容都能根據同一行的樣品牌號列內容來計算並顯示不同的顏色,於是我先在後台繼承imultivalueconverter編寫了顏色轉換規則,再在xaml中宣告這個轉換類,通過multibinding把運用於datagridcell的樣式中,同時我指定乙個樣式引數為weight,並繫結了兩個path(表示重量列的值和樣品牌號的值),最後在後台將重量列的cellstyle進行指定。

如果我還有列a,列b也希望通過樣品牌號列來進行顏色計算顯示怎麼辦?很簡單,重複步驟2,3即可,只不過為了彼此區分,我會把converterparameter的值改一下,還記得嗎,xaml中的這個字段直接傳入函式convert的第二個引數,這樣我就可以區分是重量列,還是a列,還是b列,從而指定對應的顏色方案。

DataGrid 合併單元格

在datagrid 的onloadsuccess事件中呼叫合併方法 onloadsuccess function data 合併方法 function mergecellsbyfield tableid,collist else if pertxt curtxt else ttable.datagr...

ExtJS Grid 改變單元格背景顏色的方法

第一種情況 載入資料時改變列的顏色 首先定義乙個樣式如下 這裡以紅色背景為例 x grid back red 定義改變顏色的列 效果圖如下 第二種情況 載入資料完成後改變行的顏色 首先要解決的乙個問題是如果判斷資料已經載入完畢,最簡單的方法是給grid的store新增onload事件。如果你想有條件...

EXTJS GRID 改變單元格背景顏色的方法

第一種情況 載入資料時改變列的顏色 首先定義乙個樣式如下 這裡以紅色背景為例 x grid back red 定義改變顏色的列 第二種情況 載入資料完成後改變行的顏色 首先要解決的乙個問題是如果判斷資料已經載入完畢,最簡單的方法是給grid的store新增onload事件。如果你想有條件地改變某行的...