JY Tech

윈폼으로 설문조사 결과산출 프로그램 만들기(5) 본문

Programming/MiniProject

윈폼으로 설문조사 결과산출 프로그램 만들기(5)

J.Dragon 2023. 5. 13. 19:30

이번에는 UserControl8을 추가 해 주관식 응답을 관리 해 보자

 

필자는 이런식으로 label과 textBox를 넣었다.

 

주관식 영역에서는 '엔터'키를 한 명의 응답으로 인식한다.

예시는 아래 사진과 같다.

 

애초에 해당 포스팅 자체가 필자가 실제로 만들었어서 사용중인 프로그램을 다시 하나하나 설명하는 것이기 때문에 이미 구상해 뒀던 UI를 그대로 구현중인데 다르게 하고 싶다면 예시와 달라도 상관없다

 

이제 엔터키를 누르면 줄바꿈과 동시에 '-'를 넣어주는 코드를 넣어보자

 

먼저 첫 문장에는 무조건 -가 들어가야하기 때문에 

UserControl8_Load에 다음 코드를 넣어주자

textBox1.AppendText("- ");

Append는 추가하라는 뜻이다.

윈폼 뿐만이 아니라 파이썬에서도 유사하게 응용할 수 있고, 필자가 나중에 포스팅 할 db를 활용한 프로젝트에서도 사용될 예정이다.(다만 해당 프로젝트 포스팅의 바로 다음 포스팅은 아니고 다음 다음이 될 것 같다)

 

아무튼 이렇게 로드되자마자 첫 줄은 무조건 '-'를 추가해주기 위한 코드를 작성하였다

나중에 ▽ 버튼으로 해당 컨트롤을 여러 개 추가할 수 있도록 할건데 추가될 때마다 첫번째 줄은 무조건 '-'가 생기는 것이다

 

이제 엔터키를 누르면 '- '가 추가되도록 할 것이다.

 

이전 포스팅에서 MouseUp을 사용했던 적이 있다

https://jy-tech.tistory.com/10

 

윈폼으로 설문조사 결과산출 프로그램 만들기(2)

이제 버튼을 누르면 해당 버튼의 숫자가 증가/감소하고 숫자의 합계가 나오는 기능을 구현해보자 먼저 UserControl1.cs에 다음과 같은 내용을 넣어주자 private void btn_MouseUp(object sender, MouseEventArgs e) {

jy-tech.tistory.com

keyUp도 비슷하다

아래 코드를 넣고

textBox에 keyUp에 넣어주자

private void textBox1_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) //엔터키 눌렀을 때 실행할 이벤트
            {
                textBox1.AppendText("- ");
            }
            if (e.KeyCode == Keys.Delete) //delete키로 내용을 지웠는데 모든 내용을 지웠을 때 첫 줄에 자동으로 '- '를 추가하기 위한 코드
            {
                if (textBox1.Text == "")
                {
                    textBox1.AppendText("- ");
                }
            }
            if (e.KeyCode == Keys.Back && textBox1.Text=="") //←(백스페이스)키로 내용을 지웠는데 모든 내용을 지웠을 때 첫 줄에 자동으로 '- '를 추가하기 위한 코드
            {
                textBox1.AppendText("- ");
            }
        }

 

ProMode.cs에서 주석처리 했던 public UserControl8[] btn81 = new UserControl8[501]; 의 주석을 해제하고

△▽에 이벤트를 넣어주자

 

https://jy-tech.tistory.com/16(예약글)

의 방법과 유사하다

 

 

▽에 다음과 같은 클릭 이벤트를 넣어준다

if (wLine <= 500)
            {
                this.userControl81 = new UserControl8();
                userControl81.label1.Text = wLine.ToString();
                btn81[wLine] = userControl81;
                flowLayoutPanel2.Controls.Add(userControl81);
                wLine += 1;
            }
            else
            {
                MessageBox.Show("행은 최대 500개까지만 추가할 수 있습니다!", "경고!");
                return;
            }

 

△에 다음과 같은 클릭 이벤트를 넣어준다

try
{
    flowLayoutPanel2.Controls.Remove(btn81[wLine - 1]);
    if (wLine > 1)
    {
    	wLine -= 1;
    }
}
catch
{
    MessageBox.Show("최소 두개 이상의 행을 추가해야 추가한 행을 제거할 수 있습니다!");
}

 

이제 버튼을 만들어 놓고 쓰지 않았떤 복사 붙여넣기 기능을 구현해보자

 

복사 붙여넣기의 경우 입력한 값을 dataGridView에 그대로 넣는 것이다

 

이런 식으로 각 버튼에 넣은 값이 그대로 표에 나오고 확률을 계산 해 준다

해당 기능을 구현하기 위해서는 먼저 앞서 만들었던 userControl의 코드를 수정해야 한다

 

제일 처음 만들었던 userControl1에 들어가서 '복사' 버튼의 클릭 이벤트를 만들고

아래의 코드를 넣어준다

if (Form1.mod == "pro")
{
    int a = Convert.ToInt32(button1.Text);
    int b = Convert.ToInt32(button2.Text);
    int c = Convert.ToInt32(button3.Text);
    int d = Convert.ToInt32(button4.Text);
    int g = Convert.ToInt32(button5.Text);
    ProMode.lineNum = Convert.ToInt32(label1.Text) - 1;
    ProMode.totalGap = Convert.ToInt32(label2.Text);
    ProMode.gridRes[0] = Convert.ToString(a);
    ProMode.gridRes[1] = Convert.ToString(b);
    ProMode.gridRes[2] = Convert.ToString(c);
    ProMode.gridRes[3] = Convert.ToString(d);
    ProMode.gridRes[4] = Convert.ToString(g);
}
else
{
    MessageBox.Show("해당 기능은 ProMode에서만 사용가능합니다.","경고!");
}

a~g까지의 변수는 5개의 버튼을 의미한다.(즉 버튼 2개짜리의 userControl2에 들어가면 a,b 2개의 변수만 쓴다는 소리다)

옛날에 작성한 코드여서 변수명으로 e,f는 왜 안썼는지 생각이 안난다..

그리고 promode에 만들어놨던 a~g에 저장된 값을 gridRes에 저장하는 것이다.(역시 버튼 2개짜리의 userControl2에 들어가면 gridRes[0], gridRes[1]만 쓰는 것이다)

userControl8을 제외하고 만든 모든 사용자 정의 컨트롤에 위와 같은 코드를 작성해준다.

 

※참고로 basic mode의 로드 이벤트에 아래와 같은 코드를 넣어줘야 한다

Form1.mod = "basic";

아마 basic mode를 만들 때 해당 코드는 설명하지 않았던 것으로 기억한다

 

 

이제 promode로 돌아와서 '붙여넣기'의 클릭이벤트를 만들고

아래의 코드를 넣어주자

for (int i = 0; i < Convert.ToInt32(ans) + 1; i++)
{
    String res = gridRes[i] + "(" + Math.Round(Convert.ToDouble(gridRes[i]) * 100 / totalGap, 2) + "%)";
    dataGridView1.Rows[lineNum].Cells[i].Value = res;
}

앞서 gridRes에 저장한 값을 띄우고 비율을 계산해서 dataGridView에 띄우는 것이다.

산출방식은 선택지의 응답횟수/전체응답횟수*100이고 소수 셋째 자리에서 반올림하기 위해 Round를 써줬다

 

윈폼 및 c#에서 반올림/올림/버림을 사용하는 방법은 아래와 같다

형태 코드
올림 Math.Ceiling(값) - 올림은 값을 정수로 표시
버림 Math.Truncate(값) - 버림은 값을 정수로 표시
반올림 Math.Round(값) - 둘째자리에서 반올림(=첫째자리까지 표시)
Math.Round
(값, 소수점) - 소수점 자리+1의 자리에서 반올림(=해당 자리까지 표시)

참고로 .5는 1로 반올림되지 않는다.

.5를 1로 반올림하기 위해서는 MidpointRounding.AwayFromZero를 써야한다고 한다.(우리는 둘째자리까지 표시하기 때문에 크게 상관이 없을 것 같다)

 

이제 '엑셀로 저장' 기능 외에는 실질적인 기능들은 모두 구현한 것 같다.

 

다음시간에는 엑셀로 저장하는 기능을 알아보자