在C#中重新加载表单

时间:2016-10-10 03:50:47

标签: c# forms reload

我正在尝试使用c#创建一个日历,其中包含一年中每个月的标签,其中的按钮代表标签上的日期(参见附图)。用户可以将所需年份输入到文本框中,然后单击按钮以提交他们的请求(而不是附加图片)。目前,我有日历工作,但我无法弄清楚如何在提交不同年份时重绘日历。

我尝试按照此示例https://stackoverflow.com/a/33104430但我不明白何时应该调用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}}

2 个答案:

答案 0 :(得分: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);
        }
    }
}

我对此进行了测试,似乎工作正常。

答案 1 :(得分:-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();
    }