2016-10-10 1 views
0

Ich versuche, einen Kalender mit C# erstellen, die eine Registerkarte für jeden Monat des Jahres mit Schaltflächen für die Tage auf den Registerkarten enthält (siehe angehängtes Bild). Der Benutzer kann das gewünschte Jahr in ein Textfeld eingeben und auf eine Schaltfläche klicken, um seine Anfrage zu übermitteln (nicht auf dem angehängten Bild). Momentan funktioniert der Kalender, aber ich kann nicht herausfinden, wie der Kalender neu gezeichnet wird, wenn verschiedene Jahre eingereicht werden.Reloading Formular in C#

Ich habe versucht, diesem Beispiel https://stackoverflow.com/a/33104430 zu folgen, aber ich verstehe nicht, wenn Form_Load() aufgerufen werden sollte. Ich habe auch versucht, this.refresh() an verschiedenen Orten ohne Erfolg.

Jede Hilfe würde sehr geschätzt werden.

public Form1() 
{ 
    InitializeComponent(); 
    call_on_load(); 
} 

private void call_on_load() 
{ 
    pages = tabControl.TabPages; 
    year = Convert.ToInt16(textBoxYear.Text); 
    dt = new DateTime(year, 1, 1); 

    day = -1; 
    foreach (TabPage page in pages) //declare a page object and cycle through each tab page 
    { 
     if (!initialMonth) 
     { 
      mth++;   //inc month if not first time. Originally set. 
     } 
     initialMonth = false; 
     if (mth > 12) //make a 1 year calendar 
      break; 
     //ftime = true; 
     Console.WriteLine("********************************The date is:" + dt.ToString()); 
     x = ((((int)dt.DayOfWeek) * 75) + 10); //reset x coordinate 
     y = 20; 
     for (int rows = 1; rows <= 7; rows++) // # of rows in a month 
     {     //Some months have 6 rows. Use 7 to ensure the below break statement 
      if (!ftime) 
      { 
       if (dt.Day == 1) //at the top of another month 
       { 
        ftime = true; 
        break; 
       } 
      } 

      ftime = false; 
      y += 75;  //move y coordinate 
      for (int col = 1; col <= 7; col++) //make 7 columns 
      { 
       Button b = new Button(); 
       b.Name = dt.ToString("MMMM") + "_" + Convert.ToString(dt.Day) + "_" + dt.ToString("yyyy"); //store the date in the button name to parse 
       b.Click += (s, e) =>  //https://stackoverflow.com/questions/6187944/how-can-i-create-dynamic-button-click-event-on-dynamic-button 
       { 
        secondForm = new Form2(); 
        String[] date = b.Name.Split('_'); 
        secondForm.setDate(date[0], Convert.ToInt16(date[1]), Convert.ToInt16(date[2])); 
        secondForm.Show(); 
       }; 

       b.Size = new Size(50, 50); 
       b.Left = x; 
       b.Top = y; 
       page.Controls.Add(b); //add button to current tab page 
             // btnInt++;      
       b.Text = Convert.ToString(dt.Day); 
       getDate(); 
       Console.WriteLine("The date is:" + dt.ToString()); 
       dt = dt.AddDays(1); 
       if (dt.Day == 1) 
        break; 
       x += 75; 
       if (x > 460) //if x coordinate is at the end of the line 
       { 
        x = 10; 
        break; 
       } 
      } 
     } 
    } 
} 

private void btnSubmitF1_Click(object sender, EventArgs e) 
{ 
    year = Convert.ToInt16(textBoxYear.Text); 
    //this.Refresh(); //does not redraw 
    call_on_load(); //keeps original layout, does not redraw on button click 
    //Form_Load(btnSubmitF1,e); //probably not calling this method correctly. Is this method needed? 
    //this.Refresh(); //does not redraw 
} 

private void Form_Load(object sender, EventArgs e) 
{ 
    call_on_load(); 
} 
+1

Der Code im Teil '// setup buttons, der die Tage auf jeder Registerkarte repräsentiert, ist genau das, was wir sehen müssen, um herauszufinden, was falsch läuft. Im Allgemeinen müssen Sie nichts Spezielles tun, um die Seite neu zu zeichnen, wenn Sie das Steuerelement ordnungsgemäß hinzufügen. – Enigmativity

+0

Ich muss die Steuerung nicht ordnungsgemäß hinzufügen. Ich füge eine Schaltfläche hinzu und füge dann die Schaltfläche der Registerkarte im Formular hinzu. – IBWEV

+0

Können Sie bitte den Code zeigen, wo Sie 'mth' außerhalb der' call_on_load' Methode setzen? – Enigmativity

Antwort

-1
//you just missing a postback maybe, try this. 
private void Form_Load(object sender, EventArgs e) 
    { 
    if(!IsPostBack){ 
    call_on_load(); 

    } 
    } 

bearbeitet
private void btnSubmitF1_Click(object sender, EventArgs e) 
    { 
    year = Convert.ToInt16(textBoxYear.Text); 
    //this.Refresh(); //does not redraw 
    call_on_load(); //keeps original layout, 
     //does not redraw on button click 
    //Form_Load(btnSubmitF1,e); //probably not calling 
    //this method correctly. Is this method needed? 
    //this.Refresh(); //does not redraw 
    this.ParentForm.Refresh(); 
    } 
+0

Diese Frage scheint sich um WinForms und nicht um ASP.NET zu handeln. – Enigmativity

+0

Woher bekommst du 'this.ParentForm'? – Enigmativity

0

Ich glaube nicht, das Problem mit Auffrischen der Seite zu tun ist. Ich denke, dass Sie einfach nicht die mth Variable zurücksetzen und dann die if (mth > 12) wird immer getroffen. Allerdings haben Sie nicht genug Code gezeigt, um es uns zu sagen.

Auch Ihr Code scheint nicht sehr gut strukturiert zu sein. Es gibt eine Menge Dinge, die dir Kummer bereiten könnten.

Um zu helfen, habe ich den Code für Sie auf eine Weise neu geschrieben, die meiner Meinung nach helfen würde.

Try this:

private void call_on_load() 
{ 
    var year = Convert.ToInt16(textBoxYear.Text); 
    var dt = new DateTime(year, 1, 1); 

    var months = 
     Enumerable 
      .Range(0, dt.AddYears(1).Subtract(dt).Days) 
      .Select(d => dt.AddDays(d)) 
      .GroupBy(x => x.Month); 

    foreach (var month in months) 
    { 
     var tab = tabControl.TabPages[month.Key - 1]; 
     tab.Controls.Clear(); 
     var firstDayOfWeek = (int)month.First().DayOfWeek; 
     foreach (var date in month) 
     { 
      var position = firstDayOfWeek + date.Day - 1; 
      var button = new Button() 
      { 
       Size = new Size(50, 50), 
       Left = (position % 7) * 75 + 10, 
       Top = (position/7) * 75 + 20, 
       Text = date.ToShortDateString(), 
      }; 
      button.Click += (s, e) => 
      { 
       var secondForm = new Form2(); 
       secondForm.setDate(date); 
       secondForm.Show(); 
      }; 
      tab.Controls.Add(button); 
     } 
    } 
} 

Getestet habe ich diese und es schien ganz gut zu arbeiten.

+0

Wow. Danke für deine Zeit und dein Wissen. Der Code funktioniert und du hast Recht, dass ich mth nie zurücksetze. – IBWEV