반응형

Grid에서 특정 row를 선택하여 해당 row와 관련된 modeless 창을 띄우고 작업을 하는 도중,
원래 Form에서 Grid가 정렬되어 기존 row의 handle이 변경되었을 경우 단순히 FocusedRowHandle을 보관 했다가
찾아가는 방식은 사용할 수 없다(그리드 내에서 위치가 변경 되었으므로).
이때는 다음과 같이 DataSourceRowIndex를 보관 했다가, 해당 값으로 현재의 FocusedRowHandle 값을 찾아가야 한다.
DataSourceRowIndex는 DataSource내의 고유한 index이기 때문에 GridView에서 보여지는 형태와 관계없이 일정하게 유지 되므로 이 값을 가진 RowHandle을 찾아내는 방식이다.

// modeless 창을 띄우기 전에 현재 선택된 row의 DataSourceRowIndex를 보관
var rowIndex = gView1.GetFocusedDataSourceRowIndex(); 
.....
/*
  modeless 창을 띄우고 작업하는 도중, Grid가 정렬 되었다고 가정
*/
....
// modeless 창이 닫히고, 다시 원래의 FocusedRowHandle를 찾아가게 한다.
var rowHandle = GetRowHandleFromRowIndex(gView1, rowIndex);
gView1.FocusedRowHandle = rowHandle;
 
// DataSourceRowIndex를 가진 행을 찾아서 RowHandle 값으로 되돌린다.
private int GetRowHandleFromRowIndex(GridView gridView, int rowIndex) {
  int result = -1;
 
  for (int i = 0; i < gridView.DataRowCount; i++) {
    if (gridView.GetDataSourceRowIndex(i) == rowIndex) {
      result = i;
      break;
    }
  }
 
  return result;
}
반응형
반응형

DevExpress의 DropDownButton을 사용하는 방법 입니다.

1. 도구상자에서 PopupMenu를 찾아서 폼에 추가

추가된 PopupMenu control의 우측상단 삼각형을 클릭한 후 Customise를 선택 한다.

만약 BarManager를 자동으로 생성하고 PopupMenu를 바인딩시킬 지 물어보면 Yes를 클릭한다.

PopupMenu Editor에서 메뉴를 Add 한다.

2. 도구상자에서 DropDownButton를 찾아서 폼에 추가

DropDownControl 속성 값으로 PopupMenu control을 선택한다.

DropDownButton 우측의 삼각표시 누르면 리스트가 나오는데 삼각표시 대신 버튼 누를때도 동일한 효과를 주려면 아래와 같이 Click 이벤트 처리 한다.

private void dropDownButton1_Click(object sender, EventArgs e) {
   dropDownButton1.ShowDropDown();
}

메뉴를 클릭 했을때 처리는 ItemClick 이벤트를 이용한다. 

만약 menu item 마다 개별 처리하지 않고 하나의 이벤트 핸들러에서 처리하려면 다음과 같이 ItemClickEventArgs 인자값의 Item을 이용하여 각 메뉴를 구분할 수 있다.

private void barButtonItem1_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) 
{
  Action<bool> dlg = null; 
 
  if (e.Item == barButtonItem1) 
    dlg = ShowDialog1;
  else if (e.Item == barButtonItem2) 
    dlg = ShowDialog2;
  else if (e.Item == barButtonItem3) 
    dlg = ShowDialog3; 
 
  dlg?.Invoke(false);
}
반응형
반응형

인터페이스 다중 상속 시 메소드명이 동일한 경우에는 해당 메소드는 명시적 구현 즉 '인터페이스명.메소드명' 형식으로 해야 합니다.

명시적 구현인 경우 private만 가능하기 때문에 클래스의 인스턴스로는 메소드 호출을 할 수 없고 인터페이스 타입으로 호출해야 합니다.

using System;
using System.Collections.Generic;
using System.Linq;

interface SamsungPhone {
    void TurnOn();
    void TurnOff();
    void Fold();
}

interface LGPhone {
    void TurnOn();
    void TurnOff();
    void Roll();
}

class IntegratedPhone: SamsungPhone, LGPhone {
    void SamsungPhone.TurnOn() { Console.WriteLine("Samsung Trun On"); }
    void SamsungPhone.TurnOff() { Console.WriteLine("Samsung Trun Off"); }
    void LGPhone.TurnOn() { Console.WriteLine("LG Trun On"); }
    void LGPhone.TurnOff() { Console.WriteLine("LG Trun Off"); }
    
    public void Fold() { Console.WriteLine("Folding"); }
    public void Roll() { Console.WriteLine("Rolling"); }
}

class MainClass {
    static void Main() {
        SamsungPhone samsung = new IntegratedPhone();
        samsung.TurnOn();
        samsung.Fold();
        
        LGPhone lg = new IntegratedPhone();
        lg.TurnOn();
        lg.Roll();
    }
}

실행결과

반응형
반응형

 

Electron으로 화면에 hello world를 표기하는 초간단 프로그램을 개발하는 과정입니다.
저처럼 Electron 초보자 수준에서 작성합니다.
또한 저는 윈도우즈 10 환경이므로 Mac이나 Linux에서는 일부 다를 수 있습니다.

1. Node.js 설치

Electron은 Node.js 기반으로 개발을 하기 때문에 제일 먼저 Node.js를 설치해야 합니다.
Node.js 공식 사이트에서 운영체체에 맞는 설치 파일을 내려받아 설치합니다.

nodejs.org/ko/

 

Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

Current Version은 안정성에 문제가 있을 수 있으므로 가능한 LTS버전 설치를 권장합니다. 물론 Live환경이 아닌 학습 목적의 새로운 기능을 적극적으로 시험해 보려면 Current Version을 사용하면 됩니다.

2. package.json 만들기

cmd(terminal) 창에서 임의의 작업용 폴더를 생성하고 해당 폴더로 이동 후 npm init를 하면 초기 상태의 package.json 파일이 생성됩니다 (나오는 질문에 모두 enter를 치면 default value로 답변되어 작성됩니다). 

mkdir helloworld
cd helloworld
npm init

생성된 package.json은 다음과 같이 되어 있습니다.

package.json

3. Electron 설치하기

npm을 이용하여 electron을 설치합니다.

npm install electron --save-dev

4. index.html, index.js 작성 하기

index.html 파일

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <title>Hello world</title>
</head>
<body>
<h1>Hello world</h1>
</body>
</html>

index.js 파일

const {app, BrowserWindow} = require("electron");

let win;

function createWindow() {
  win = new BrowserWindow({width: 800, height: 600});
  win.loadURL('file://' + __dirname + '/index.html');
  win.on("closed", () => {win = null;});
}

app.on("ready", createWindow);
app.on("window-all-closed", () => {
  if (process.platform !== "darwin") {
    app.quit();
  }
});

app.on("activate", () => {
  if (win === null) {
    createWindow();
  }
});

5. 작성된 프로그램 실행

cmd 창에서 작성된 프로그램을 실행합니다.

node_modules\.bin\electron .

이상 Electron으로 만들어 본 첫번째 저의 프로그램 작성기 였습니다.

 

 

반응형

+ Recent posts