다음 프로그램은 실제로 내 프로젝트가 아니지만 나중에 실제 프로그램에서 원하는 것을 더 쉽게 이해할 수 있습니다.
현재 기능을 볼 수있는 .gif는 다음과 같습니다.
내가 원하는 게 뭐야? 레이블 총점을 추가하고 싶습니다. 체크 박스와 텍스트 박스의 포인트를 포함하는 이것은 또한 실시간으로 계산되어야합니다. 각 그룹 (패널)
어디에 문제가 있습니까? 두 개의 다른 이벤트 핸들러로 작업하고 있기 때문에 이것을 관리하는 방법을 모릅니다.
다음은 출처입니다.
namespace Test1
{
public partial class Form1 : Form
{
int chkBoxX = 10;
int chkBoxY = 30;
int txtBoxX = 10;
int txtBoxY = 50;
int panelX = 0;
int panelY = 0;
public Form1()
{
InitializeComponent();
for (int k = 1; k <= 3; k++)
{
Panel panel = new Panel();
panel.Width = 550;
panel.Height = 100;
panel.Location = new Point(panelX, panelY);
panel.BackColor = Color.RoyalBlue;
panelY += 110;
this.Controls.Add(panel);
AddElements(panel);
}
}
void AddElements(Panel panel) {
Label labelChkBoxPoints = new Label();
labelChkBoxPoints.Name = "labelChkBoxPoints";
labelChkBoxPoints.Location = new Point(400, 30);
labelChkBoxPoints.AutoSize = true;
labelChkBoxPoints.BackColor = Color.White;
labelChkBoxPoints.Font = new Font(labelChkBoxPoints.Font.FontFamily, 12, FontStyle.Bold);
panel.Controls.Add(labelChkBoxPoints);
Label labelTxtBoxPoints = new Label();
labelTxtBoxPoints.Name = "labelTxtBoxPoints";
labelTxtBoxPoints.Location = new Point(400, 50);
labelTxtBoxPoints.AutoSize = true;
labelTxtBoxPoints.BackColor = Color.White;
labelTxtBoxPoints.Font = new Font(labelChkBoxPoints.Font.FontFamily, 12, FontStyle.Bold);
panel.Controls.Add(labelTxtBoxPoints);
Label labeltotalPoints = new Label();
labeltotalPoints.Location = new Point(430, 40);
labeltotalPoints.Font = new Font(labeltotalPoints.Font.FontFamily, 14, FontStyle.Bold);
// labeltotalPoints.Text = "10XXXXXXXXXXXX0";
labeltotalPoints.AutoSize = true;
labeltotalPoints.BackColor = Color.White;
// labeltotalPoints.;
panel.Controls.Add(labeltotalPoints);
for (int i = 1; i <= 5; i++)
{
CheckBox checkBox = new CheckBox();
checkBox.Name = String.Format("checkBox{0}", i);
checkBox.Text = "";
checkBox.Width = 20;
checkBox.Height = 15;
checkBox.Location = new Point(chkBoxX, chkBoxY);
chkBoxX += 26;
checkBox.CheckedChanged += checkBox_CheckedChanged;
panel.Controls.Add(checkBox);
}
for (int j = 1; j <= 5; j++)
{
TextBox tb = new TextBox();
tb.Name = String.Format("textBox{0}", j);
tb.Width = 60;
tb.Location = new Point(txtBoxX, txtBoxY);
txtBoxX += 80;
tb.TextChanged += txtBox_CheckedChanged;
panel.Controls.Add(tb);
}
chkBoxX -= (5 * 26);
txtBoxX -= (5 * 80);
}
private void txtBox_CheckedChanged(object sender, EventArgs e)
{
int total = 0; int points = 0;
foreach (object tb in ((TextBox)sender).Parent.Controls)
{
if (tb is TextBox)
{
if (!string.IsNullOrEmpty(((TextBox)tb).Text))
{
if (!int.TryParse(((TextBox)tb).Text, out points))
{
((TextBox)tb).Text = "";
}
total += points;
}
}
}
(((TextBox)sender).Parent.Controls["labelTxtBoxPoints"]).Text = Convert.ToString(total);
}
private void checkBox_CheckedChanged(object sender, EventArgs e)
{
int counter = 0;
foreach (object cb in ((CheckBox)sender).Parent.Controls)
{
if (cb is CheckBox)
{
if (((CheckBox)cb).Checked)
{
counter++;
}
}
}
(((CheckBox)sender).Parent.Controls["labelChkBoxPoints"]).Text = Convert.ToString(counter);
}
}
}
두 이벤트가 끝날 때 "포인트"레이블의 합계를 계산하지 않는 이유는 무엇입니까?
멋지고 간단합니다 (더 효율적으로 할 수 있지만 이유가 없습니다 ...)
checkBox_CheckedChanged, txtBox_CheckedChanged 끝에서 TotalPoints ()를 호출하면됩니다.
int TotalPoints()
{
int total = (from i in GetControlsWithPoint(this)
where i.Text != null && i.Text != string.Empty
select Convert.ToInt32(i.Text)).Sum();
// MessageBox.Show("total" + total);
return total;
}
List<Control> GetControlsWithPoint(Control parent)
{
List<Control> results = new List<Control>();
if (parent == null)
return results;
foreach (Control item in parent.Controls)
{
if (item.Name == "labelChkBoxPoints" || item.Name == "labelTxtBoxPoints")
results.Add(item);
results.AddRange(GetControlsWithPoint(item));
}
return results;
}
패널 당 합계 만 원하는 경우 패널 내에서만 검색하도록 TotalPoint 메서드를 변경하기 만하면됩니다.
int TotalPoints(Panel p)
{
int total = (from i in GetControlsWithPoint(p) where i.Text != null && i.Text != string.Empty select Convert.ToInt32(i.Text)).Sum();
// MessageBox.Show("total" + total);
return total;
}
그리고 이벤트가 끝날 때
Panel p = (((Control)sender).Parent) as Panel;
TotalPoints(p);
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다