Hi
I am having difficulty disabling in cell editing in the whole grid. What I am looking for is behavior similar to an old fashioned list view in the report view (ie click a row anywhere to select the whole row).
I have tried playing with the SelectionTypeRecord, SelectionTypeField and SelectionTypeCell properties but they have no effect. I know this can be achieved on a cell by cell basis but this seems a bit of an inefficient way of doing it. Does anyone know why the aforementioned properties have no effect or am I just missing something?
Also could someone point me at how the change the colour of cell text in C# from the codebehind, I am new to WPF but am I looking at altering a style?
Thanks
Alan
Hello Alan,
Actually what you are looking for is CellClickAction property of the FieldSettings object in the XamDataGrid. You can set that to SelectRecord and when you click anywhere in the DataRecord, it will be selected.
You can change the color of the cell text in procedural code, throught the correspondant CellValuePresenter. You can use the static get methods of the CellValuePresenter (CellValuePresenter.FromCell(), CellValuePresenter.FromRecordAndField()) and then set its Foreground property.
If you would like to change that based on a cell value, you can use converters.
Please follow this link for more information on this (with the difference that the Background instead of Foreground is changed)
http://community.infragistics.com/forums/p/20644/74574.aspx#74574
Please let me know if you have any more questions on this.
Coming back on the text color I'm still having problems.
I need to set the text color of each row depending on a color supplied at run time by a field in the datasource. The color is set by the end user and can be anything. I have managed to get half way there using this code
private Style s;private Style s2;private Setter se;private Setter se2;private void xamDataGrid1_InitializeRecord(object sender, Infragistics.Windows.DataPresenter.Events.InitializeRecordEventArgs e){ //e.Record.DataPresenter.Background = Brushes.Red; DataRecord dr = e.Record as DataRecord;
if (dr != null) { if (((string)dr.Cells[5].Value).Trim() == "MR") { s = new Style(); se = new Setter(); se.Property = CellValuePresenter.ForegroundProperty; se.Value = Brushes.Red; s.Setters.Add(se); dr.Cells[5].Field.Settings.CellValuePresenterStyle = s; } else { s2 = new Style(); se2 = new Setter(); se2.Property = CellValuePresenter.ForegroundProperty; se2.Value = Brushes.Aquamarine; s2.Setters.Add(se2); dr.Cells[5].Field.Settings.CellValuePresenterStyle = s2; } } }
This kinda works when you scroll down the list but when you scroll back the event is no longer fired (I guess because of virtual loading) but all the items are re-rendered in aquamarine.
Any ideas please?
Using the Default settings of the XamDataGrid, the event should fire when scrolling no matter of the direction. If you have not so many records in the XamDataGrid, you can set the RecordContainerGenerationMode to PreLoad, which will disable the virtualization of the records.
If not, you can also use the RecordsInViewChanged event, which will fire when the records, that are currently in view change - in your scenario very close to InitializeRecord event.
Test these two options and let me know if you still have any problems.
I think I am using the default settings of the grid, what setting would stop the InitializeRecord from firing?
I apologize. The InitializeRecord fires when it is created (on load, grouped, ungouped, expanded). You should use the RecordsInViewChanged event for this.
could you give me an example of using the RecordsInViewChanged event in this context please? I can't seem to make this work.
Actually a further update. I have now also noticed that all cells in a column are re-rendered when you horizontally scroll them out of and back into view so that means you would possibly have to handle 3 events just to maintain the state of your grid! Also the conditional rendering of different cells in different text colors is inaccurate and therefore unuseable in any case. I achieved what I am trying to do in the last version of our product with a VB6 listview with no difficulty.
Having spent many hours and searching your forum it seems that many people have had this problem but there doesn't seem to be a solution. I can't really waste much more time on this but I'll give it one more go before giving up. If this problem can be solved I will definitely buy the tools.
Firstly here is a code snippet showing how the process is run. I realise that this is probably not the most efficient way to do it as all visible records are re-evaluated each time the event fires but I haven't figured out the proper way to use the RecordsInViewChanged event. This method however should be re-rendering the visible rows every time this event is fired.
private void xamDataGrid1_RecordsInViewChanged(object sender, Infragistics.Windows.DataPresenter.Events.RecordsInViewChangedEventArgs e){ if (e.Source != null) { Record[] drc = xamDataGrid1.GetRecordsInView(false); foreach (Record r in drc) { DataRecord dr = r as DataRecord; if (dr != null) { if (((string)dr.Cells[5].Value).Trim() == "MR") { Style sRed = new Style(); Setter seRed = new Setter(); seRed.Property = CellValuePresenter.ForegroundProperty; seRed.Value = Brushes.Red; sRed.Setters.Add(seRed); dr.Cells[5].Field.Settings.CellValuePresenterStyle = sRed; dr.Cells[4].Value = "RED"; } else { Style sGreen = new Style(); Setter seGreen = new Setter(); seGreen.Property = CellValuePresenter.ForegroundProperty; seGreen.Value = Brushes.Green; sGreen.Setters.Add(seGreen); dr.Cells[5].Field.Settings.CellValuePresenterStyle = sGreen; dr.Cells[4].Value = "GREEN"; } } } }}
Below is a screen shot of a portion of the grid when initally loaded but not scrolled. All text is rendered black but the MR & MRS column should be colored the same as the description in the previous column.
The state remains the same if the scroll bar is dragged (ie RecordsInViewChanged event doesn't fire)
If you scroll records by clicking on the scroll bar end buttons colors are changed but the do not properly match their descriptions (image below). This however is not random the same mistakes happen every time you run the project.
Finally if you scroll horizontally and back again the whole column is re-rendered to one color (image below).
Is this just a limitation of the grid, a bug or is there a better way to do it? The color values CANNOT BE SET IN XAML as they are provided by the datasource at runtime.
thanks
Thanks for clearing that out. You have to "inherit" the style for the DataRecordCellArea from the one of the theme like this:
namespace for themes: xmlns:Themes="http://infragistics.com/Themes"
...
<Style TargetType="{x:Type igDP:DataRecordCellArea}" BasedOn="{x:Static Themes:DataPresenterOnyx.DataRecordCellArea}">
No. The color of the text is a second effect.
What I mean is that Onyxs theme, when you move the mouse over the records, shows the row in orange .
DataRecordCellArea.BackGroundHover is grey and it should be the Onyx color.
If this is the case, you have to use the following style (option 3 once again)
<Style TargetType="{x:Type igDP:CellValuePresenter}">
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="BorderHoverBrush" Value="Transparent"/>
<Setter Property="ForegroundHoverStyle">
<Setter.Value>
<Style TargetType="ContentPresenter">
<Setter Property="TextElement.Foreground" Value="{Binding Path=Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type igDP:CellValuePresenter}}}"/>
</Style>
</Setter.Value>
</Setter>
What this "complex" binding does is to bind the Foreground hover color to the Foreground color.
Let me know if you have any questions on this.
Just to make sure I am on the right track, when you hover over the cell, you want the color of the text (Red,Green) not to change, right?
I'm sorry. I've forgotten saying this effect occurs in Option 3 CellValuePresenter.