2016-10-10 2 views
0

Я пытаюсь создать календарь с помощью C#, который содержит вкладку для каждого месяца в году с кнопками, отображающими дни, расположенные на вкладках (см. Прикрепленное изображение). Пользователь может ввести желаемый год в текстовое поле и нажать кнопку, чтобы отправить запрос (а не на прикрепленную картинку). В настоящее время у меня работает календарь, но я не могу понять, как перерисовать календарь, когда будут представлены разные годы.Перезагрузка формы в C#

Я попытался следовать этому примеру https://stackoverflow.com/a/33104430, но я не понимаю, когда следует называть Form_Load(). Я также пробовал this.refresh() в разных местах безрезультатно.

Любая помощь будет высоко оценена.

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

Код в части '// кнопки настройки, представляющие дни на каждой странице вкладки', на самом деле мы должны увидеть, чтобы понять, что происходит не так. Как правило, вам не нужно делать ничего особенного, чтобы перерисовать страницу, если вы правильно добавляете элемент управления. – Enigmativity

+0

Я должен добавить контроль неправильно. Я добавляю кнопку, а затем добавляю кнопку на вкладку формы. – IBWEV

+0

Можете ли вы показать код, где вы устанавливаете 'mth' вне метода' call_on_load'? – Enigmativity

ответ

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

    } 
    } 

отредактировал

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

Этот вопрос, похоже, о WinForms, а не ASP.NET. – Enigmativity

+0

Откуда вы получаете 'this.ParentForm'? – Enigmativity

0

Я не думаю, что этот вопрос должен сделать с обновления страницы. Я думаю, вы просто не перезагружаете переменную mth, а затем if (mth > 12) всегда попадает. Однако вы не указали достаточно кода, чтобы мы могли точно сказать.

Кроме того, ваш код не очень хорошо структурирован. Там много чего происходит, что может вызвать у вас горе.

Чтобы помочь, я переписал код для вас таким образом, который, я думаю, поможет.

Попробуйте это:

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); 
     } 
    } 
} 

Я испытал это, и это, казалось, прекрасно работать.

+0

Ничего себе. Спасибо за ваше время и знания. Код работает, и вы правы в том, что я никогда не перезагружаю mth. – IBWEV

Смежные вопросы