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