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