본문 바로가기

.NET/asp.net

asp.net CheckBoxList 다중선택 저장, 읽기

728x90
반응형
일을 하다가 CheckBoxList 컨트롤을 써야 되는 경우가 생겼었습니다. 그런데 RadoiButtonList 와는 다르게 SelectedValue를 이용해서 선택된 모든 item의 값을 가져올 수가 없더군요. 그래서 생각을 하다가 CheckBoxList의 모든 아이템을 다 검사를 해서 해야된다는 것을 알게 되었습니다.

그것뿐만 아니라 선택된 리스트를 DB, File에 저장을 시켰다가 다시 읽어와서 CheckBoxList에 반영을 하기 위해서도 SelectedValue와 같은 형식으로는 되지 않는다는 것을 알게되었고요.

아무래도 저와 같은 고민을 하신분이 분명있을 꺼라 생각이 됩니다. 그럼 이것을 어떻게 해결해야되는지 확인해 보도록 하겠습니다.

보통은 DB에 값을 저장하고 DB의 값을 읽어와 반영 하겠지만 필자의 귀차니즘 때문에 간단히 텍스트 파일에 값을 저장하고 읽어와서 처리하도록 하겠습니다.

<form id="form1" runat="server">
    <div>
        <asp:CheckBoxList ID="cbTest" runat="server" RepeatColumns="4" RepeatDirection="Horizontal">
        </asp:CheckBoxList>
    </div>
    <div style="margin-top: 15px; margin-left: 90px">
        <asp:Button ID="btnTest" runat="server" Text="Submit" OnClick="btnTest_Click" />
    </div>
</form>

간단하게 위와 같이 페이지를 구성했습니다. 체크박스리스트의 아이템은 cs단에서 생성을 하려고 채워두지 않았고요. 그럼 cs단에서 소스를 하나하나 살펴보죠.

protected void Page_Load(object sender, EventArgs e)

{

    if (!IsPostBack)

    {

        MakeCheckBoxItem(cbTest);

        string checkList = ReadSaveFile();

        FillCheckBoxList(cbTest, CheckListSplit(checkList));

    }

}

 

private void FillCheckBoxList(CheckBoxList checkbox, string[] str)  //체크박스리스트의 아이템에 해당 아이템을 체크함

{

    foreach (string item in str)

    {

        foreach (ListItem li in checkbox.Items)

        {

            if (item == li.Value.ToString())

            {

                li.Selected = true;

                break;

            }

        }

    }

}

 

private string[] CheckListSplit(string str)    //파일에 저장되어있던 체크된 아이템리스트를 '|'로 분리

{

    char[] ch = {'|'};

    string[] strSplit = str.Split(ch, StringSplitOptions.None);

    return strSplit;

}

 

 

private void MakeCheckBoxItem(CheckBoxList checkbox)    //체크박스리스트의 아이템을 생성

{

    for (int i = 0; i < 12; i++)

    {

        ListItem list = new ListItem("Test" + (i + 1).ToString(), (i + 1).ToString());

        checkbox.Items.Add(list);

    }

}

 

private string ReadSaveFile()      //텍스트파일에 저장되어 있는 선택된 아이템 리스트를 읽어온다.

{

    string returnValue = string.Empty;

    FileInfo fInfo = new FileInfo("c:\\test.txt");

    if (fInfo.Exists)

    {

        FileStream fs = new FileStream("c:\\test.txt", FileMode.Open, FileAccess.Read, FileShare.None);

        byte[] buffer = new byte[1024];

        int count = fs.Read(buffer, 0, buffer.Length);

        returnValue = Encoding.UTF8.GetString(buffer, 0, count);

        fs.Close();

        fs.Dispose();

    }

    return returnValue;

}

 

protected void btnTest_Click(object sender, EventArgs e)

{

    string str = GetSelectedList(cbTest);

    SaveFile(str);

}

 

private string GetSelectedList(CheckBoxList checkbox)    //선택된 체크박스리스트의 아이템의 value값을 읽어온다.

{

    string str = string.Empty;

    foreach (ListItem li in checkbox.Items)

    {

        if (li.Selected)

        {

            if (str == "")

            {

                str = li.Value;

            }

            else

            {

                str += "|" + li.Value;

            }

        }

    }

    return str;

}

 

private void SaveFile(string str)      //선택된 체크박스리스트의 value 값을 파일에 저장한다.

{

    FileStream fs = new FileStream("c:\\test.txt", FileMode.Create, FileAccess.Write, FileShare.None);

    byte[] buffer = Encoding.UTF8.GetBytes(str);

    fs.Write(buffer, 0, buffer.Length);

    fs.Close();

    fs.Dispose();

}


기능 별로 메소드를 하나씩 생성을 해두었습니다. 여기서 주위 깊게 봐야 하는 곳이 선택된 아이템의 Value 값을가져오는 GetSelectedList 메소드와 파일로부터 읽어온 선택되었던 아이템 value 값을 이용해 다시 체크박스리스트에 반영시키는 FillCheckBoxList 메소드입니다. 


보시는 것과 같이 특별한 문법은 쓰지 않았습니다. 각 리스트를 순회하면서 Selected를 체크해서 선택되어 있다면 value값을 저장하고 또는 체크를 시키는 방법을 사용하였습니다. 꽤 간단하지요.


특별한 문법은 없지만 꽤 많이 쓰일 수 있는 부분이라 이렇게 포스팅을 해보았습니다. 많은 분들에게 도움이 되었으면 좋겠네요.

728x90
반응형