No nie tak całkowicie :) ale warto jednak pamiętać o takim małym wynalazku msowym o nazwie Windows Presentation Foundation w skrócie powszechnie znanym jako WPF. Ale dlaczego?
Podam prosty przykład :) Stwórzcie mi komórkę w gridzie bindowaną do danych wyglądającą tak:
Gdzie:
- Nazwa - pochodzi z danych z bazy;
- Klepsydra - zawiera custom context menu;
- CheckBox - po kliknięciu otwiera okno w którym w zależności od akcji odznaczy się lub nie; dobra tą opcję można pominąć, ważne by się odhaczał a odhaczenie oznacza zmianę danych.
Tutaj mogę wam podpowiedzieć, by to zrobić należy przeciążyć kilka klas lub przynajmniej jedną (w zależności czy aby tylko i wyłącznie chcemy zaktualizować komórkę czy też kolumnę/wiersz: DataGridViewCell, DataGridViewColumn, DataGridViewRow, a i do tego może warto dodać Support edycji w gridzie danego wiersza: IDataGridViewEditingControl.
Jak dalej macie ochotę i uważacie, że tak będzie dobrze to polecam kilka sampli ze stron MSDN.
Ja ogólnie wymiękłem kiedy zacząłem oprogramowywać metodę:
protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
{
/* … */
}
Tam pół biedy parametry, ale jej ciało, dla przykładu z sampli msowych:
// Finally paint the NumericUpDown control
Rectangle srcRect = new Rectangle(0, 0, valBounds.Width, valBounds.Height);
if (srcRect.Width > 0 && srcRect.Height > 0)
{
paintingNumericUpDown.DrawToBitmap(renderingBitmap, srcRect);
graphics.DrawImage(renderingBitmap, new Rectangle(valBounds.Location, valBounds.Size),
srcRect, GraphicsUnit.Pixel);
}
A jak obliczy się liczbę linii kodu potrzebną by zrobić taką prostą rzecz jak umieszczenie NumericUpDown control w gridzie, to naprawdę popełnienie samobójstwa z wykorzystaniem krakersa wydaje się całkiem rozsądnym wyjściem :) Tak byście nie musieli ściągać to podam wartość wraz z komentarzami, to 1470 linii kodu... (sic!)
To teraz napiszmy to samo w WPFie :)
<GridViewColumn>
<GridViewColumnHeader Content="kol1" ToolTip="toolTip1" />
<GridViewColumn.CellTemplate>
<DataTemplate>
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Bottom">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="25" />
<ColumnDefinition Width="25" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.ColumnSpan="2" Text="{Binding Path=Name}" Margin="2" HorizontalContentAlignment="Center" />
<Image Grid.Row="1" Grid.Column="0" Source="../Resources/wait.png" Width="16" Height="16" Margin="2">
<Image.ContextMenu>
<ContextMenu>
<MenuItem Header="wszystko" />
</ContextMenu>
</Image.ContextMenu>
</Image>
<CheckBox Grid.Row="1" Grid.Column="1" Margin="2" />
</Grid>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
Mhhh, mhhh przepraszam, ile to linii? Sam nie wiem czy opłaca się je nawet liczyć... a do tego nie napisałem ani jednej linijki kodu w C# :) Po prostu piękne :)
Oczywiście to tylko przykład i nie mówię, że WinForms idą do lamusa, ale chcę tylko zwrócić waszą uwagę na to, że czasami warto znać inne technologie i w razie co skorzystać z nich a nie strzelać sobie w kolano.