c#

  • [c#] 크로스-스레드 예외란 무엇인가

    어느 스레드에서 만들어진 객체는 원칙적으로 다른 스레드에서 수정할 수 없다. 두 개 이상의 스레드들에서 동시에 하나의 객체를 수정하도록 하면 하나의 작업이 마무리되기 전에 다른 작업이 덮어써 버리는 문제가 생긴다. 이런 상황이 되면 윈도우즈는 cross-thread 예외로 처리한다. 하나의 객체를 여러 스레드들에서 동시에 읽는 건 덮어쓰고 말고 할 게 없으니 상관없다. 주로 문제되는 상황은 윈도우즈의 비주얼 컨트롤을…

  • [c#] 차트 기본 예제

    아래 코드는 선 차트를 그리는 예제 둘이다. 시리즈에 바로 바인드를 하는 것과 차트에 바인드를 하는 거다. 여기에서 바인드라는 개념은 DataTable 등을 DataGridView에 바인드하는 것과는 다르다. 데이터를 바꿔도 차트가 새로 그려지지는 않는다. 어떤 바인드 방법으로도 데이터가 바뀌면 차트를 새로 그려야 한다. y 값들만 만들었으므로 x 값은 자동으로 추가되게 해야 한다. IsXValueIndexed를 true로 하면 되는데 디자이너 창에서도…

  • [c#] 차트의 y축을 셋 이상으로 하기

    하나의 ChartArea에는 최대 두 개씩의 x축들과 y축들이 제공된다. 각각 위와 아래, 왼쪽과 오른쪽에 위치하게 된다. 하지만 더 많이 필요할 때도 있다. 예를 들어 크기가 많이 다른 세 개의 시리즈들을 하나의 y축에 선 차트로 그리면 일부는 그저 수평선 비슷하게 나올 거다. 각 시리즈의 절대적인 값이 아닌 변화되는 정도를 세 개의 시리즈들 한꺼번에 비교하려 할 땐 각…

  • [c#] x축 데이터 없이 리스트로만 차트 그리기

    차트 예제들을 찾아보면 하나 같이 x 값과 y 값을 만들어서 그린다. 그럴 필요 없이 간단하게 x 데이터 없이 List<int>만으로도 구현할 수 있다. 아래의 코드는 그냥 수직선으로 출력된다. x 값을 따로 설정하지 않아서 하나의 x 좌표 위에 겹쳐서 그려지니 그렇다. 굳이 루프를 돌려 별 의미 없이 단순히 증가하는 x 값을 만들기 위해 코드를 추가하지 않아도 된다….

  • [c#] 닷넷 chart 클래스 구조

    .net에는 차트를 그리기 위한 chart 클래스가 있다. 차트는 series로 구성된다. 시리즈는 일련의 데이터다. 예를 들면 주가를 나타내는 일봉들의 무리다. 주가 차트를 보면 연속되는 일봉들 아래에 거래량을 나타내는 막대들이 있듯이 하나의 차트에는 여러 개의 시리즈들을 만들 수 있다. chart 컨트롤을 폼에 만들면 Series1이라는 시리즈가 하나 자동으로 만들어진다. 이거는 Chart.Series[0]으로 엑세스할 수 있다. 시리즈는 DataPoint로 이뤄진다. 주가…

  • [c#] 닷넷에서 chart 클래스 이용하기

    닷넷 프레임워크에는 차트 클래스가 있지만 닷넷에는 없다. 누겟으로 따로 설치해야 한다. tools > nuget package manager > manage nuget packages for solution > browse > WinFoms.DataVisualization 설치를 하면 툴박스에 WinFoms.DataVisualization 그룹이 생기고 그 안에 chart 컨트롤이 있다.

  • [c#] 그냥 닷넷과 닷넷 프레임워크의 차이

    .net framework는 예전 꺼고 그냥 .net이라고만 하는 건 요새 꺼다. 전자를 다운로드하려 마이크로소프트 웹사이트에 접속하면 그냥 닷넷을 이용하라는 안내가 나온다. 닷넷 프레임워크는 이제 더 이상 버전 업이 되지 않는다. 닷넷 프레임워크가 버전 업 되던 시기에는 닷넷 코어라는 이름으로 서로를 구별했다. 이제 전자는 사라져 가게 되어 굳이 서로를 구별할 필요가 없게 되었다. 후자에서 코어라는 이름을 떼어…

  • [c#] BindingList와 DataGridView의 바인딩을 일시적으로 끊기

    BindingList를 DataGridView에 바인딩한 뒤 잠깐 바인딩을 끊어야 할 때가 있다. 예를 들어 루프를 돌려 바인딩 리스트에 엘리먼트를 추가하는 경우 바인딩을 끊지 않으면 엘리먼트 하나가 추가될 때마다 데이터 그리드 뷰가 갱신되어 부하가 커진다. 간단하게 아래의 방법을 생각해 볼 수 있지만 무식하고 부하가 크고 데이터 그리드 뷰의 일부 설정들이 초기화된다. BindingSource1.RaiseListChangedEvents 프라퍼티를 이용하면 간단하다. 아래의 예제에서 버튼…

  • [c#] BindingList를 DataGridView에 바인딩할 때 생기는 버그들

    아래의 코드는 클래스가 담긴 BindingList를 DataGridView에 바인딩하는 예제다. 그저 바인딩만 했을 뿐이지만 빈 엘리먼트가 바인딩 리스트에 저절로 만들어지고 데이터 그리드 뷰에 출력까지 된다. 이 문제를 우회하는 데에는 두 개의 방법들이 있다. 1. Form_Load 아닌 이벤트에서 바인딩을 한다.2. DataGridView.AllowUserToAddRows를 false로 한다. 아래의 버그는 위의 버그와 연결되어 있다. 위 코드에 덧붙여 Form_Click 이벤트에서 BindingList.Add 메서드를 실행하면 System.InvalidOperationException:…