C# comboBox 에 DB 테이블 정보를 가져와서 List Up 하는 방법이다.
MySQL DB를 직접 접속하는 방식이 아니라, Web 서버 정보를 JSON 으로 파싱해서 연동하는 방법이다.
기본 사항은 http://net-informations.com/q/faq/combovalue.html 와 http://stackoverflow.com/questions/3063320/combobox-adding-text-and-value-to-an-item-no-binding-source 참조하면 도움된다.
코드는 일반적인 형태와 약간 다르게 처리할 수 밖에 없었다.
일반적인 경우에는 CB.DataSource = new BindingSource(cat1Source, null); 대신에 CB.DataSource = category1.result; 로 하면 된다.
하지만 이렇게 하면 전체 라는 구분자가 보이지 않는다.
그래서 별도로 Dictionary 를 이용해서 저장한 다음에 다시 매핑을 시켰다.
서버 파일을 변경하여 연동 에러가 발생하게 하여 미처 고려하지 못한 버그도 수정 반영하였다.
화면에 보이는 Text 만 고려하지 않고 value 까지 고려한 이유는 comboBox 아이템을 선택했을 때 uid 를 이용하여 DB 테이블 조회를 하기 위해서다.
using System;
using System.Web;
using System.Web.Script.Serialization;
using System.Net;
using System.Windows.Forms;
using System.Collections.Generic;
using System.IO;
using System.Data;
using System.Text;
private void Form1_Load(object sender, EventArgs e)
{
cat1comboBox(cat1comboBox1); // DB 테이블 정보 가져오기
}
void cat1comboBox(ComboBox CB)
{
CB.Items.Clear();
Dictionary<string, string> cat1Source = new Dictionary<string, string>();
cat1Source.Add("전체", "0"); // DB에는 전체가 없어서 추가
try
{
string URL = "http://IP주소/cat1comboBox.php";
string json = GetPHPJSON(URL);
if (json != null)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
JsonHelper category1 = serializer.Deserialize<JsonHelper>(json); // Json String 객체로 반환 (역직렬화)
foreach (var dr in category1.result)
{
cat1Source.Add(dr.classname, dr.uid);
}
CB.DataSource = new BindingSource(cat1Source, null);
CB.DisplayMember = "Key";
CB.ValueMember = "Value";
CB.SelectedIndex = 0; // 첫번째 아이템 선택
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void cat1comboBox1_SelectedIndexChanged_1(object sender, EventArgs e)
{
if (cat1comboBox1.SelectedIndex > 0)
{
string key = ((KeyValuePair<string, string>)cat1comboBox1.SelectedItem).Key;
string value = ((KeyValuePair<string, string>)cat1comboBox1.SelectedItem).Value;
MessageBox.Show(key + " : " + value);
}
}
string GetPHPJSON(string url)
{
try
{
var webRequest = (HttpWebRequest)WebRequest.Create(url);
var webResponse = (HttpWebResponse)webRequest.GetResponse();
if ((webResponse.StatusCode == HttpStatusCode.OK) && (webResponse.ContentLength > 0))
{
var reader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8, true);
return @reader.ReadToEnd().Trim();
}
else
{
MessageBox.Show(string.Format("Status code == {0}", webResponse.StatusCode));
return null;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return null;
}
}
public class cat1comboBox
{
public string uid { get; set; }
public string classname { get; set; }
}
public class JsonHelper
{
public List<cat1comboBox> result { get; set; }
}
'C# > 통신' 카테고리의 다른 글
C# GetDataFromWeb 사용자 함수 (0) | 2016.08.20 |
---|---|
C# comboBox 에 Text, Value 추가 및 POST, JSON (0) | 2016.08.19 |
C# JSON 과 dataGridView 연동 개념 이해 (0) | 2016.08.18 |
C# Web 사이트에 PostData 저장하기 (0) | 2016.03.20 |
C# Web 접속 로그인 함수 만들기 (HttpWebRequest 방식) (0) | 2016.03.20 |