Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

verrueckt1993

Frischling

  • »verrueckt1993« ist der Autor dieses Themas

Beiträge: 85

Beruf: Informationstechnischer Assistent Fachrichtung AE, 2. Jahr

  • Private Nachricht senden

1

15.02.2011, 08:13

[C# - WPF] Kalender erstellen

Guten Morgen,

ich bin gerade dabei, einen Kalender zu programmieren. Das Layout mit XAML ist an sich kein Ding, allerdings müssen die UI - Elemente dynamisch im C# - Code erstellt werden, weil der Monat z.B. immer mit einem anderen Wochentag beginnt, sodass die Positionen der Buttons (jeder Tag wird durch einen Button repräsentiert) ändern muss.

Das Layout in XAML (nur mit den Containerelementen logischerweise) sieht folgendermaßen aus:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<Window x:Class="Interface_Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="300" Width="300"
        Loaded="Window_Loaded">
    <Grid 
        x:Name="grd_main" 
        Background="White">
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition  Height="3*" />
        </Grid.RowDefinitions>
        <Grid Name="grd_nav" Grid.Row="0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition Width="2*" />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
        </Grid>
        <Grid Grid.Row="1" Name="grd_btns">
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
        </Grid>
    </Grid>
</Window>


Die Code - Behind Datei sieht folgendermaßen aus:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            DateTime dat = new DateTime();
            dat = DateTime.Today;

            // Das hier funktioniert
            TextBlock mon = new TextBlock();
            mon.Text = MonthToString(dat);
            grd_nav.Children.Add(mon);
            Grid.SetColumn(mon, 1);
            mon.HorizontalAlignment = HorizontalAlignment.Center;
            mon.VerticalAlignment = VerticalAlignment.Center;

            // Das hier nicht
            TextBlock mo = new TextBlock();
            mo.Text = "Mo";
            grd_btns.Children.Add(mo);
            Grid.SetRow(mo, 0);
            Grid.SetColumn(mo, 0);
            mo.HorizontalAlignment = HorizontalAlignment.Center;
            mo.VerticalAlignment = VerticalAlignment.Center;



            /*Button[] btns = new Button[35];
            
            for (int i = 1; i <= 6; ++i)
            {
                for (int j = 0; j <= 7; ++j)
                {
                    grd_btns.Children.Add(btns[i * j]);
                    Grid.SetRow(btns[i * j], i);
                    Grid.SetColumn(btns[i * j], j);
                }
            }
        }*/

        private string MonthToString(DateTime date)
        {
            switch ((int)date.Month)
            {
                case 1: return "Januar";
                case 2: return "Februar";
                case 3: return "März";
                case 4: return "April";
                case 5: return "Mai";
                case 6: return "Juni";
                case 7: return "Juli";
                case 8: return "August";
                case 9: return "September";
                case 10: return "Oktober";
                case 11: return "November";
                case 12: return "Dezember";
                default: throw new ArgumentOutOfRangeException("(int)<Instanzname>.Month muss zwischen 1 und 12 liegen.");
            }
        }


So. Die wichtigste Frage ist, warum das obere funktioniert und das untere nicht.

PS: Grade n bisschen rumgespielt und das obere auskommentiert. Die Ausgabe des Monats kommt trotzdem. Wenn ich das Eltern-Grid ändere, bleibt es in grd_nav. Hat irgendwer eine Idee, woran das liegen könnte? Auch ein neues Erstellen oder neustarten der IDE (VCS Express 10) hilft nicht.

EDIT: Argh. Es hing am Datum. Ich hatte das Datum heut Morgen auf Februar zurückgesetzt. Habs gestern auf März gesetzt gehabt, weil n Klassenkamerad sehern wollte, dass das wirklich synamisch funktioniert -.-'. Das Erstellen der Buttons allerdings funktioniert immer noch nicht.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »verrueckt1993« (15.02.2011, 08:40)


verrueckt1993

Frischling

  • »verrueckt1993« ist der Autor dieses Themas

Beiträge: 85

Beruf: Informationstechnischer Assistent Fachrichtung AE, 2. Jahr

  • Private Nachricht senden

2

15.02.2011, 09:03

So, ich schreib mal grad ne neue Antwort, um das Ganze übersichtlich zu halten, da sich ja mittlerweile das ein oder andere am Code geändert hat:

XAML:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<Window x:Class="Interface_Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="300" Width="300"
        Loaded="Window_Loaded">
    <Grid 
        x:Name="grd_main" 
        Background="White">
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition  Height="3*" />
        </Grid.RowDefinitions>
        <Grid Name="grd_nav" Grid.Row="0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition Width="2*" />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
        </Grid>
        <Grid Grid.Row="1" Name="grd_btns">
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <TextBlock Grid.Row="0" Grid.Column="0" Text="Mo" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <TextBlock Grid.Row="0" Grid.Column="1" Text="Di" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <TextBlock Grid.Row="0" Grid.Column="2" Text="Mi" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <TextBlock Grid.Row="0" Grid.Column="3" Text="Do" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <TextBlock Grid.Row="0" Grid.Column="4" Text="Fr" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <TextBlock Grid.Row="0" Grid.Column="5" Text="Sa" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <TextBlock Grid.Row="0" Grid.Column="6" Text="So" HorizontalAlignment="Center" VerticalAlignment="Center" />
        </Grid>
    </Grid>
</Window>


C#:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            DateTime dat = new DateTime();
            dat = DateTime.Today;
            
            TextBlock mon = new TextBlock();
            mon.Text = MonthToString(dat);
            grd_nav.Children.Add(mon);
            Grid.SetColumn(mon, 1);
            mon.HorizontalAlignment = HorizontalAlignment.Center;
            mon.VerticalAlignment = VerticalAlignment.Center;
            
            //Das hier funzt immer noch nicht.
            Button[] btns = new Button[35];
            
            for (int i = 0; i <= 5; ++i)
            {
                for (int j = 0; j <= 7; ++j)
                {
                    int it = (i * 7) + j;
                    grd_btns.Children.Add(btns[it]);
                    Grid.SetRow(btns[it], i);
                    Grid.SetColumn(btns[it], j);
                }
            }

        private string MonthToString(DateTime date)
        {
            switch ((int)date.Month)
            {
                case 1: return "Januar";
                case 2: return "Februar";
                case 3: return "März";
                case 4: return "April";
                case 5: return "Mai";
                case 6: return "Juni";
                case 7: return "Juli";
                case 8: return "August";
                case 9: return "September";
                case 10: return "Oktober";
                case 11: return "November";
                case 12: return "Dezember";
                default: throw new ArgumentOutOfRangeException("(int)<Instanzname>.Month muss zwischen 1 und 12 liegen.");
            }
        }
    }


Das Seltsame an der Sache ist, dass es keinen Compile-time error gibt, aus dem sich auf den Fehler schließen lassen würde, genauso wenig einen Runtime-Error in form einer Exception. Die Buttons werden einfach nicht angezeigt.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »verrueckt1993« (15.02.2011, 09:12)


DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

3

15.02.2011, 09:12

Was genau funktioniert denn nicht?
Edit: Ha grade dazu editiert, schon gut ;)

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

4

15.02.2011, 09:16

Deine Buttons die du dem grd_btns hinzufügst haben keinerlei Inhalt und da sich die Buttons selber resizen je nach inhalt sind diese somit vermutlich einfach nur zu klein um dargestellt zu werden.

verrueckt1993

Frischling

  • »verrueckt1993« ist der Autor dieses Themas

Beiträge: 85

Beruf: Informationstechnischer Assistent Fachrichtung AE, 2. Jahr

  • Private Nachricht senden

5

15.02.2011, 09:21

Hm. Ich hab das mit dem Inhalt nicht berücksichtigt, da bei folgendem XAML - Code (direkt hinter den TextBlocks eingesetzt) der Button sich auf den ganzen Teilabschnitt ausstreckt:

<Button Grid.Row="1" Grid.Column="0" />

Ich werd mal ein bisschen rumprobieren und das Ergebnis dazueditieren (;

versprochender EDIT: Hab den Tag als Inhalt hinzugefügt, ich seh immer noch keinen einzigen Button. Mit diesem Code funktioniert's, müsste also an den schleifen liegen:

C#-Quelltext

1
2
3
4
5
            Button but = new Button();
            but.Content = "1";
            grd_btns.Children.Add(but);
            Grid.SetRow(but, 1);
            Grid.SetColumn(but, 0);

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »verrueckt1993« (15.02.2011, 09:28)


verrueckt1993

Frischling

  • »verrueckt1993« ist der Autor dieses Themas

Beiträge: 85

Beruf: Informationstechnischer Assistent Fachrichtung AE, 2. Jahr

  • Private Nachricht senden

6

15.02.2011, 09:42

Nach ein wenig rumspielen gehts. Und zwar so:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
for (int i = 0; i <= 5; ++i)
{
   for (int j = 0; j <= 7; ++j)
   {
        Button btn = new Button();
        btn.Content = it.ToString();
        grd_btns.Children.Add(btn);
        Grid.SetRow(btn, i);
        Grid.SetColumn(btn, j);
    }
}


Jetztt berechnet er allerdings manche Tage falsch und es richtet sich noch nicht nach dme wochentag des ersten Tages, aber das ist doch schonmal ien Fortschritt^^

EDIT: Tage korrigiert:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
for (int i = 0; i <= 5; ++i)
            {
                for (int j = 0; j < 7; ++j)
                {
                    Button btn = new Button();
                    btn.Content = (i * 7) + j + 1;
                    grd_btns.Children.Add(btn);
                    Grid.SetRow(btn, i);
                    Grid.SetColumn(btn, j);
                }
            }

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »verrueckt1993« (15.02.2011, 09:48)


verrueckt1993

Frischling

  • »verrueckt1993« ist der Autor dieses Themas

Beiträge: 85

Beruf: Informationstechnischer Assistent Fachrichtung AE, 2. Jahr

  • Private Nachricht senden

7

15.02.2011, 11:42

So, jetzt bin ich soweit, dass ich sagen kann: Das Teil ist fertig! x)

Ich stell die Lösung mit rein, für den Fall, dass es jemanden interessiert.

XAML - Layout:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<Window x:Class="Interface.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="210" Width="210"
        Loaded="Window_Loaded">
    <Grid 
        x:Name="grd_main" 
        Background="White">
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition  Height="4*" />
        </Grid.RowDefinitions>
        <Grid Name="grd_nav" Grid.Row="0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition Width="2*" />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <Button 
                Name="btn_la"
                Grid.Column="0" Grid.Row="0" 
                Content="&lt;" 
                Margin="12, 6, 12, 6"
                Click="btn_la_Click"/>
            <Button 
                Name="btn_ra"
                Grid.Column="2" Grid.Row="0" 
                Content=">" 
                Margin="12, 6, 12, 6" 
                Click="btn_ra_Click" />
        </Grid>
        <Grid Grid.Row="1" Name="grd_btns">
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <TextBlock Grid.Row="0" Grid.Column="0" Text="Mo" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <TextBlock Grid.Row="0" Grid.Column="1" Text="Di" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <TextBlock Grid.Row="0" Grid.Column="2" Text="Mi" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <TextBlock Grid.Row="0" Grid.Column="3" Text="Do" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <TextBlock Grid.Row="0" Grid.Column="4" Text="Fr" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <TextBlock Grid.Row="0" Grid.Column="5" Text="Sa" HorizontalAlignment="Center" VerticalAlignment="Center" />
            <TextBlock Grid.Row="0" Grid.Column="6" Text="So" HorizontalAlignment="Center" VerticalAlignment="Center" />
        </Grid>
    </Grid>
</Window>


Code - Behind:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Interface
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private DateTime dat;
        private TextBlock mon;

        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            dat = new DateTime();
            dat = DateTime.Today;

            Refresh();
        }

        private void btn_la_Click(object sender, RoutedEventArgs e)
        {
            if ((int)dat.Month > 1)
                dat = new DateTime(dat.Year, (int)dat.Month - 1, dat.Day);
            else
                dat = new DateTime((int)dat.Year - 1, (int)dat.Month + 11, dat.Day);
            Refresh();
        }

        private void btn_ra_Click(object sender, RoutedEventArgs e)
        {
            if ((int)dat.Month < 12)
                dat = new DateTime(dat.Year, (int)dat.Month + 1, dat.Day);
            else
                dat = new DateTime((int)dat.Year + 1, (int)dat.Month - 11, dat.Day);
            Refresh();
        }

        private void Refresh()
        {
            //Monatsanzeige
            grd_nav.Children.Remove(mon);
            mon = new TextBlock();
            mon.Text = MonthToString(dat)+" "+dat.Year.ToString();
            grd_nav.Children.Add(mon);
            Grid.SetColumn(mon, 1);
            mon.HorizontalAlignment = HorizontalAlignment.Center;
            mon.VerticalAlignment = VerticalAlignment.Center;

            //Buttons
            int max = GetDaysOfMonth(dat);
            grd_btns.Children.RemoveRange(7, max);
            int k = (int)dat.DayOfWeek;
            if (k == 0)
                k = 7;
            k -= 1;

            GenerateButtons(k, max);
        }

        private void GenerateButtons(int k, int max)
        {
            int cou = 0;
            for (int i = 0; i < 5 && cou < max; ++i)
            {
                for (int j = 0; (j + k) < 7 && cou < max; ++j)
                {
                    Button btn = new Button();
                    btn.Content = cou + 1;
                    grd_btns.Children.Add(btn);
                    Grid.SetRow(btn, (i + 1));
                    Grid.SetColumn(btn, j + k);
                    cou++;
                }
                k = 0;
            }
        }

        private static string MonthToString(DateTime date)
        {
            switch ((int)date.Month)
            {
                case 1: return "Januar";
                case 2: return "Februar";
                case 3: return "März";
                case 4: return "April";
                case 5: return "Mai";
                case 6: return "Juni";
                case 7: return "Juli";
                case 8: return "August";
                case 9: return "September";
                case 10: return "Oktober";
                case 11: return "November";
                case 12: return "Dezember";
                default: throw new ArgumentOutOfRangeException("(int)<Instanzname>.Month muss zwischen 1 und 12 liegen.");
            }
        }

        private static int GetDaysOfMonth(DateTime date)
        {
            switch ((int)date.Month)
            {
                case 1: return 31;
                case 2:
                    if (date.Year % 4 != 0) return 28;
                    else                    return 29;
                case 3: return 31;
                case 4: return 30;
                case 5: return 31;
                case 6: return 30;
                case 7: return 31;
                case 8: return 31;
                case 9: return 30;
                case 10: return 31;
                case 11: return 30;
                case 12: return 31;
                default: throw new ArgumentOutOfRangeException("(int)<Instanzname>.Month muss zwischen 1 und 12 liegen.");
            }
        }
    }
}

Werbeanzeige