Diskuze: DataGrid - Rows
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 14 zpráv z 14.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Koukni na style triggery.
Když jsem si hrál ještě s WPF, tak jsem dělal přesně něco podobného. Pro ukázku jak to vypadalo:
<Style x:Key="CellStyle" TargetType="DataGridCell">
<Setter Property="FontFamily" Value="Calibri"/>
<Setter Property="TextBlock.VerticalAlignment" Value="Center"/>
<Setter Property="Padding" Value="5,15"/>
<Setter Property="BorderThickness" Value="0"/>
<!--Allows padding in DataGridCell-->
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Border Padding="{TemplateBinding Padding}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
<ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding IsPast}" Value="True">
<Setter Property="Foreground" Value="#a8a8a8" />
<Setter Property="FontStyle" Value="Italic" />
<Setter Property="Opacity" Value="0.6"/>
</DataTrigger>
<DataTrigger Binding="{Binding IsSure}" Value="False">
<Setter Property="Foreground" Value="#FF999999" />
<Setter Property="FontStyle" Value="Italic" />
</DataTrigger>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="#FF3A3A3A"/>
<Setter Property="Opacity" Value="1"/>
</Trigger>
</Style.Triggers>
</Style>
Díky, ale nejdříve bych chtěl rozběhout ten cyklus.......
Todle je UI záležitost, takže to máš mít v XAMLu. Jestli to chceš psát někde do code-behind, počkej si na někoho jiného.
Právě, že bych to tak raději řešil, ale každopádně děkuju za tip, kouknu na to...
V tomto seriáli je niečo podobné, môžeš z toho výjsť.
6. díl - Upomínač narozenin v C# .NET WPF - Návrh oken
http://www.itnetwork.cz/…n-navrh-oken
Dotazem do DB bych zjistil řádky, u kterých se blíží konec platnosti a potom ty řádky obarvil, cyklem for
Máš nějaké zkušenosti s mazáním záznamů v DataGridu v WPF ? Je to pro mě prostě nadlidský úkol....
Mám
SqlCommand cmd = new SqlCommand("DELETE FROM Polozka WHERE ID = @ID", conn);
cmd.Parameters.AddWithValue("@ID", grdZaznamy.SelectedValue);
cmd.ExecuteNonQuery();
ale prostě nemohu zjistit jak smazat vybraný řádek.......
Něco podobného jsem v DataGridu dělal. Cyklus na zabarvování řádků
tam byl taky, jen podle jiných kritérií. Jenom už je to nejakou dobu, tak mi
dej chvíli než to najdu, pak sem ten cyklus hodim.
K tomu mazání:
S DataGridem byly furt nějaký problémy, tak sem nakonec vytvořil třídu
představující jeden řádek, naplnil jí public proměnejma podle
sloupečků, udělal z ní List<> a data z DB dával do toho listu. Pak
jsem jenom Datagridu nastavil ItemsSource na null a hned po tom na ten list (bez
null mi to tam dělalo bordel).
Ve výsledku sem vůbec nemusel řešit problémy s DataGridem, všechny změny
sem proved na tom Listu<> a ten sem pak jenom hodil do DataGridu.
Tak už to mam a i to obarvování sem částečně ochcal tim Listem<>, ale snad by to mohlo pomoct:
/// <summary>
/// Obarví prvky v tabulce
/// </summary>
private void iniColorGridRows() {
tabulka.ItemContainerGenerator.StatusChanged += (s, e) => { //už nevim proč, ale musí to tam bejt
int rowCount = tabulka.Items.Count; //počet řádků v DataGridu (tabulka)
int a = 0; //pomocná proměnná, spíš by se to mělo menovat cisloRadku nebo taknějak
foreach (var bedna in potahyList) { //tady se foreachem projede List<> ve kterym sou data do tabulky
if (a >= tabulka.Items.Count) //kdyby náhodou bylo v tabulce míň řádků
break;
var row = (DataGridRow)tabulka.ItemContainerGenerator.ContainerFromIndex(a);
//tady podle indexu (a) vytáhnu z tabulky jeden řádek a hodim ho do proměnný row.
//určitě by nějak šlo podle dalšího indexu zase z row vytáhnou to pole kde ty máš datum
//já už to měl v tom listu, tak sem to neřešil
if (row != null) { //a pokud ten řádek existuje
if (bedna.Kusu == bedna.Vlozeno)
row.Background = Brushes.Green; //tak se začne obarvovat
else if (bedna.Kusu > bedna.Vlozeno)
row.Background = Brushes.Orange;
else if (bedna.Kusu < bedna.Vlozeno)
row.Background = Brushes.Red;
else
row.Background = Brushes.Black;
a++; //pak se jenom zvýší číslo řádku a jede se znova
}
}
};
}
Teď bych si bejt tebou zjistil jak z tý proměnný row vytáhnout
podle indexu tu kolonku s datem, pak jenom vezmeš for cyklus podle
tabulka.Items.Count, postupně vytaháš do proměnný row řádky, u
každýho zjistíš datum a to porovnáš a podle něj obarvíš řádek přes
row.Background
Snad pomůže.
"Máš nějaké zkušenosti s mazáním záznamů v DataGridu v WPF ? Je to pro mě prostě nadlidský úkol...."
Ja používam ListBox na výpisy riadkov a tam mám nastavený výber riadka
po kliknutí myšou.
S vybratým si môžem robiť čo chcem, napr. zmazať.
V triede Skladnik (niečo ako admin) mám metódu:
public void OdoberDhmZaznam(DhmZaznam dhmZaznam)
{
DhmZaznamy.Remove(dhmZaznam);
}
a v main metódu
private void vymazDhmButton_Click(object sender, RoutedEventArgs e)
{
if (DhmListBox.SelectedItem != null)
{
if (MessageBox.Show("Naozaj to chcete vymazať?", "Vymazať", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.OK)
{
try
{
skladnik.OdoberDhmZaznam((DhmZaznam)DhmListBox.SelectedItem);
skladnik.UlozDhmZaznamy();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Chyba", MessageBoxButton.OK,
MessageBoxImage.Error);
}
}
}
}
Ako som ti už písal vyššie, vychádzam z miestneho tutoriálu.
Podľa mňa nie je veľmi štastný nápad vyfarbovať vybrané riadky. Čo
keď je riadkov viac ako sa vôjde do okna?, Bude sa chcieť užívateľovi
scrolovať?
Možno by bolo lepšie (na pokyn - button alebo automaticky, keď taká udalosť
nastane) uložiť vybraté riadky do nového listu a ten vypísať do nového
okna.
v okně se zobrazuje asi 15 řádků a je to podle mě dostačující, je to spíš pro použití pro pár osob v okolí... takže pokud se časem ukáže že tam bude vícero záznamů, myslím, že to udělám podle tvého návrhnu
Zobrazeno 14 zpráv z 14.