c#中重载表单

本文关键字:表单 重载 | 更新日期: 2023-09-27 18:12:21

我正在尝试使用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();  
}

c#中重载表单

我不认为这个问题与刷新页面有关。我认为你只是没有重置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);
        }
    }
}

我测试了这个,它似乎工作得很好。

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