이번에 회사에서 윈폼에서 웹으로 넘어가게 되며 kendo UI Grid라는 것을 사용해보았다. 

kendo UI는 

Part 1 - Hello jQuery | Kendo UI Third-Party Frameworks | Kendo UI for jQuery (telerik.com)

 

Part 1 - Hello jQuery | Kendo UI Third-Party Frameworks | Kendo UI for jQuery

Third Party Libraries / ASP.NET Web Forms This tutorial will walk you through building an HTML5 application in ASP.NET. In this first out of five parts you are going to learn: How to install jQuery How to use jQuery with Web Forms How to use the Internet E

docs.telerik.com

위 자료를 참조하였다. 

영어를 보며 최대한 이해해보려고 노력했고, 이해하기 조금 어려웠다.

db 연결은 LINQ to SQL 클래스를 사용했고 해당 부분은 동영상을 참조하면 될 것이다.

 

이글에서는 GRID를 사용하기 위해서 Controller 단과 클라이언트 html 파일 위주로 정리하겠다.

 

    public class WM_BILLOFMATERIAL_CONTROLLER : ApiController 
    {
        private Data.NorthwindContextDataContext _context = new Data.NorthwindContextDataContext();
        HttpRequest _request = HttpContext.Current.Request;


        public Models.Response Get()
        {
            int take = _request["take"] == null ? 10 : int.Parse(_request["take"]);
            int skip = _request["skip"] == null ? 0 : int.Parse(_request["skip"]);
            var bom = (from b in _context.WM_BILLOFMATERIAL
                          select new Models.WM_BILLOFMATERIAL(b)).Skip(skip).Take(take).ToArray();

            return new Models.Response(bom, _context.WM_BILLOFMATERIAL.Count());
        }


        public HttpResponseMessage Post()
        {
            var response = new HttpResponseMessage();

            try
            {
                var bom_update = (from bom in _context.WM_BILLOFMATERIAL
                                  where bom.ITEMID == _request["ITEMID"]
                                  select bom).FirstOrDefault();

                if (bom_update != null)
                {
                    bom_update.QTY = _request["QTY"] == null ? bom_update.QTY : Convert.ToDecimal(_request["QTY"]);
                    _context.SubmitChanges();
                }
                else
                {
                    response.StatusCode = System.Net.HttpStatusCode.InternalServerError;
                    response.Content = new StringContent(string.Format("the Item with itemId {0} was not found in the database"));
                }
                return response;
            }catch (Exception ex)
            {
                response.StatusCode = System.Net.HttpStatusCode.InternalServerError;
                response.Content = new StringContent(string.Format("there was an error updating bom"));
                return response;
            }
        }
    }

위 컨트롤러에는 Get 메서드와 Post 메서드가 있다.

 

해당 메소드들을 통해 Get 요청과 Post 요청을 처리한다.

뭔가 매핑을 하지않아도 메서드 이름을 Get, Post로 정한 다음에 사용하기만 해도 처리가 된다.

 

Controller가 수행되는 순서에 대해 정리해보겠다.

클라이언트에서 Controller로 get, post 등의 요청을 하면 제일 먼저 클래스 가장 위의 Data.NorthwindContextDataContext _context가 가장 먼저 실행되고 다음으로

HttpRequest _request = HttpContext.Current.Request 가 실행되었다. 

해당 변수들은 생성자에 들어가있지도 않은데 디버깅 포인트가 해당 포인트에서 가장 먼저 잡히는 것이 이해가 잘 안 되었다.  그래서 NorthwindContextDataContext를 Ctrl + 우클릭으로 타고 들어가 보니 mapping이란 키워드가 들어간 변수가 있었다. 아마 자동으로 매핑해주기 위해서 생성된 클래스 같다.

 

다음 순서로 URL 경로가 맞다면 해당 요청에 해당되는 POST 또는 GET 메소드가 실행된다. 

GET 메소드의 경우 아래와 같이 구현되어있다. 우선 핵심인 LINQ가 사용된 부분을 보자면 

in 뒤에있는뒤에 있는 클래스들 통해 값을 받고 from 뒤에 있는 변수 이름에 값을 넣고 select를 통해서 값을 표현할 방식을 정한다. 그다음 take과 skip은 kendo grid에서 갑을 한 번에 얼마나 가지고 올지를 정하는 부분이다. 그리고 데이터를 성공적으로 가져왔다면 Models 클래스에 있는 Response에 해당 값을 담아서 클라이언트로 반환을 해준다. 아래 코드를 통해 말하자면 한 페이지에 10개의 행을 나타내겠다는 의미이다.

        public Models.Response Get()
        {
            int take = _request["take"] == null ? 10 : int.Parse(_request["take"]);
            int skip = _request["skip"] == null ? 0 : int.Parse(_request["skip"]);
            var bom = (from b in _context.WM_BILLOFMATERIAL
                          select new Models.WM_BILLOFMATERIAL(b)).Skip(skip).Take(take).ToArray();

            return new Models.Response(bom, _context.WM_BILLOFMATERIAL.Count());
        }

다음으로 Post 메소드를 살펴보겠다. Post 메서드는 아래와 같이 구현되어있다.

        public HttpResponseMessage Post()
        {
            var response = new HttpResponseMessage();

            try
            {
                var bom_update = (from bom in _context.WM_BILLOFMATERIAL
                                  where bom.ITEMID == _request["ITEMID"]
                                  select bom).FirstOrDefault();

                if (bom_update != null)
                {
                    bom_update.QTY = _request["QTY"] == null ? bom_update.QTY : Convert.ToDecimal(_request["QTY"]);
                    _context.SubmitChanges();
                }
                else
                {
                    response.StatusCode = System.Net.HttpStatusCode.InternalServerError;
                    response.Content = new StringContent(string.Format("the Item with itemId {0} was not found in the database"));
                }
                return response;
            }catch (Exception ex)
            {
                response.StatusCode = System.Net.HttpStatusCode.InternalServerError;
                response.Content = new StringContent(string.Format("there was an error updating bom"));
                return response;
            }
        }

위 포스트 메서드는 사용자가 웹 화면에서 특정 아이템의 재고량을 변화시킬 때 사용되는 메서드이다. 사용자가 특정 아이템의 재고량을 수정하고 업데이트 버튼을 클릭하면 수행된다. 사용자가 입력한 값이 만약에 null이라면 업데이트하지 않도록 하거나 에러가 발생하게 되면 처리해주는 로직이 추가되어 있다.

 

다음으로 Default.aspx를 살펴보겠다. 해당 파일은 사용자가 사용할 UI 단 웹이다. 해당 파일 중 script 부분을 

집중적으로 분석해보겠다.

<script>
        $(function () {
            $("#employeesGrid").kendoGrid({
                columns: [
                    { field: "ITEMID", title: "아이템ID" },
                    { field: "QTY", title: "수량" },
                    "ISVALID",
                    { command: ["edit", "destroy"], title: ""}
                ],
                sortable: true,
                pageable: true,
//                editable: true,
                editable: "inline",
                dataSource: new kendo.data.DataSource({
                    transport: {
                        read: "api/WM_BILLOFMATERIAL_",
                        update: {
                            url: function (WM_BILLOFMATERIAL) {
                                //return "api/WM_BILLOFMATERIAL_/" + WM_BILLOFMATERIAL.ITEMID
                                return "api/WM_BILLOFMATERIAL_/" + WM_BILLOFMATERIAL.ITEMID
                            },
                        type: "POST"
                        }
                    },
                    pageSize: 15,
                    serverPaging: true,
                    schema: {
                        // the array of repeating data elements (employees)
                        data: "Data",
                        // the total count of records in the whole dataset. used
                        // for paging
                        total: "Count",
                        model: {
                            id: "ITEMID",
                            fields: {
                                ITEMID: { editable: false , nullable: false },
                                QTY: { validation: { required: true }, nullable: false },
                                ISVALID: { validation: { required: true }, nullable: false }
                            }
                        }
                    }
                })
            });
        });
    </script>

위 스크립트 태그 안에 있는 내용은 전부 하나의 kendoGrid를 위한 기능이다. 해당 함수의 기능을 위에서부터 아래로 살펴보도록 하겠다. 

columns

가장 위에 있는 columns에는 columns 이름 그대로 kendoGrid에서 나타나게 될 속성들의 모임이다. 만약에 속성 이름 그대로 안 쓰고 다른 이름을 쓰고 싶다면 { filed: "ITEMID", title: "아이템 ID" }라고 쓰면 되고 속성 이름을 변경 없이 그대로 사용하고 싶으면 "ISVALID" 그냥 속성 이름을 문자열 형태로 주면 된다.

sortable

위 sotable 변수에 true 값을 넣어주게 되면 속성 이름을 클릭할 수 있게 되는데 클릭을 하면 해당 속성 값을 기준으로 그리드의 행들이 정렬 되게 된다.

pageable

그리드의 모든 속성을 보여주지 않고 한 페이지에 해당되는 행의 수만큼 표현해서 보여주는 설정을 할 수 있도록 한다.

editable

편집을 가능하게 한다. true나 혹은 inline 값을 할당할 수 있었는데 true를 넣게 되면 속성 개별로 값을 할당할 수 있고 inline 값을 넣으면 한 행씩 편집할 수 있도록 한다.

DataSource

해당 부분을 통해서 서버로 데이터를 어떻게 보낼지 결정할 수 있다.

pageSize

한 번에 불러올 수 있는 행의 개수를 정한다.

serverPaging

해당 속성 값을 true로 주면 서버에서 반환할 때 page의 크기를 조절할 수 있다.

schema

schema를 통해 각 속성들의 밸리데이션을 클라이언트 단에서 체크할 수 있게 된다.

 

 

'C#' 카테고리의 다른 글

한번만 실행되게 하는방법  (0) 2021.05.18
.NET Reflection  (0) 2021.03.29
Dbset 직접 바인딩 에러 해결법  (0) 2021.02.25
외부 프로젝트 참조하기  (0) 2021.02.25
[Winform] Dock  (0) 2021.01.22

만약 버튼을 클릭하고 여러번 실행되여 한번만 실행되게 하고싶을 때 아래와 같이 x,y축의 움직임을 통해서도 원하는 결과를 얻을 수 있었다.

            if (x == Cursor.Position.X || y == Cursor.Position.Y) return;
            x = Cursor.Position.X;
            y = Cursor.Position.Y;

'C#' 카테고리의 다른 글

kendo UI Grid  (0) 2021.12.01
.NET Reflection  (0) 2021.03.29
Dbset 직접 바인딩 에러 해결법  (0) 2021.02.25
외부 프로젝트 참조하기  (0) 2021.02.25
[Winform] Dock  (0) 2021.01.22

www.csharpstudy.com/Practical/Prac-reflection.aspx

 

.NET Reflection 1 - C# 프로그래밍 배우기 (Learn C# Programming)

.NET Reflection .NET Reflection은 .NET 객체의 클래스 타입, 메서드, 프로퍼티 등의 메타 정보를 런타임 중에 알아내는 기능을 제공한다. 또한, 이러한 메타 정보를 얻은 후, 직접 메서드를 호출하거나 프

www.csharpstudy.com

참조

 

.NET Reflection은 .NET 객체의 클래스 타입, 메서드, 프로퍼티 등의 메타 정보를 런타임 중에 알아내는 기능을 제공한다. 또한 이러한 메타 정보를 얻은 후, 직접 메서드를 호출하거나 프로퍼티를 변경하는 등의 작업도 가능하다.

 

어떠한 경우 Reflection이 꼭 필요한 경우가 있는데 런타임 중에 이런 메타 정보를 동적으로 알아야 하는 경우에 유용하다. 

 

필자의 경우 위와같은 형식으로 사용하였다. 위 Insert를 포함하고 있는 클래스는 다중 상속 클래스이며 entity를 제네릭 형식으로 받고 있다. 제네릭 형식으로 받고 있어서 동적으로 어떤 변수를 가지고 있는지 알 필요가 있었는데 GetType().GetProperty("column_name") 와 같은 형식으로 알아낼 수 있었다. 

 

Reflection 같은 경우 속도가 느리므로 되도록이면 사용하지 않는 것이 좋다. 

'C#' 카테고리의 다른 글

kendo UI Grid  (0) 2021.12.01
한번만 실행되게 하는방법  (0) 2021.05.18
Dbset 직접 바인딩 에러 해결법  (0) 2021.02.25
외부 프로젝트 참조하기  (0) 2021.02.25
[Winform] Dock  (0) 2021.01.22

.toList를 붙여준다.

 

'C#' 카테고리의 다른 글

한번만 실행되게 하는방법  (0) 2021.05.18
.NET Reflection  (0) 2021.03.29
외부 프로젝트 참조하기  (0) 2021.02.25
[Winform] Dock  (0) 2021.01.22
C# Thread  (0) 2020.12.01

프로젝트 EntityFrameWork_test에서 ClassLibrary1 프로젝트를 참조하려고한다. 

EntityFrameWork_test에 참조를 우클릭하여 참조 추가를 선택한다. 

참조관리자엣서 프로젝트에 참조하고자하는 프로젝트를 선택하여 확인한다. 

사용하고자 하는 곳에서 using으로 사용하도록 한다. 

'C#' 카테고리의 다른 글

.NET Reflection  (0) 2021.03.29
Dbset 직접 바인딩 에러 해결법  (0) 2021.02.25
[Winform] Dock  (0) 2021.01.22
C# Thread  (0) 2020.12.01
C# Dictionary  (0) 2020.11.30

Dock

- 부모 컨트롤의 크기가 변경되면 같이 변경되도록 하는 것이다.

 

Dock 사용전

창을 확대하기 전에는 창에 그리드랑 패널이 가득 차있어보이지만 창을 키우면

그리드랑 패널의 크기는 그대로 고정되어 있고 창만 늘어난 것을 확인할 수 있다. 창의 크기를 늘리기위해서 Dock이라는 것을 사용할 수 있다.

 

위에 버튼이 있는 패널이 panelControl2 이고 두번째 panelControl1는 textEdit이 들어가는 공간이고

밑에 GridControl1이 DB에 관련된 내용이 들어가는 곳이다. 

Dock을 설정할때 나타나게 되는 창

panelControl1과 panelControl2같은 경우 위에 붙어있는 것을 확인할 수 있다. 따라서 Dock의 값을 TOP으로 설정하고 

GridControl1의 Dock 값은 FIill로 주었다. 

panelControl1과 panelControl2는 둘다 Dock의 값으로 TOP을 주었다. 그렇기 때문에 누가 위쪽으로 갈지 우선순위가 정해저야 한다. 위 이미지를 보면 디자이너에서 Form 컨트롤에 panel들이 추가되고 있는 모습을 볼 수 있다. 위 순서에 따라서 Dock의 우선순위가 변하기 때문에 우선순위 설정을 잘 해주어야 한다.

성공적으로 창의 크기가 커짐에 따라서 내부 컨트롤들도 커지는 것을 확인하였다. 패널 내부에있는 컨트롤들과의 간격이 너무 가까운 것 같으니 Margin의 크기를 좀더 키워서 간격을 만드는 것이 좋겠다. 

'C#' 카테고리의 다른 글

.NET Reflection  (0) 2021.03.29
Dbset 직접 바인딩 에러 해결법  (0) 2021.02.25
외부 프로젝트 참조하기  (0) 2021.02.25
C# Thread  (0) 2020.12.01
C# Dictionary  (0) 2020.11.30

선언

Thread worker;

사용

스레드를 사용하기 전에 작업 스레드가 진행 중에 있으면 중단하고 제거하는 코드를 추가하였다. 

ParameterizedThreadStart()함수를 통해 매게변수를 필요로 하는 함수를 사용할 수 있고 매게변수가 없으면 스레드 생성 매개변수로 그냥 함수명을 주면 된다.

        private void button1_Click(object sender, EventArgs e)
        {
            int textbox_value = int.Parse(textBox1.Text);
            if (textbox_value <= 249 && textbox_value >= 1)
            {
                if (worker != null)
                {
                    if (worker.IsAlive)
                    {
                        //worker.Interrupt();
                        worker.Abort();
                    }
                }
                worker = new Thread(new ParameterizedThreadStart(Run));
                worker.Start(textbox_value);
            }

        }

스레드 함수

작업 스레드를 생성하여 얻을 수 있는 이점은 Thread.Sleep() 함수를 편안하게 사용할 수 있다.

만약 UI 스레드에서 Sleep을 사용하게 되면 모든 동작이 멈추게 될 것이다. 왜냐면 UI 스레드는 메인 스레드 주요한 대부분의 작업이 이루어지고 있는 스레드이기 때문이다. 

작업 스레드에서는 UI에 관련된 값에 직접 접근하면 문제가 발생한다. . UI 스레드와 작업 스레드에서 동시에 UI에 접근하는 상황은 예기치 못한 오류를 발생할 수 있기 때문에 BeginInvoke라는 함수를 사용하여 UI에 접근하도록 한다.  

        public void Run(object idx)
        {
            try
            {
                if (!this.IsHandleCreated)
                {
                    this.CreateHandle();
                }
                int frame_idx = Convert.ToInt32(idx);
                if (now_idx < frame_idx)
                {
                    // 전진
                    for (int i = now_idx; i <= frame_idx; i++)
                    {
                        string str = filename(i);
                        pictureBox1.BeginInvoke(new Action(() => pictureBox1.Load(str)));
                        now_idx = frame_idx;
                        Thread.Sleep(50);
                    }
                }
                else if (now_idx > frame_idx)
                {
                    // 후진
                    for (int i = now_idx; i >= frame_idx; i--)
                    {
                        string str = filename(i);
                        pictureBox1.BeginInvoke(new Action(() => pictureBox1.Load(str)));
                        now_idx = frame_idx;
                        Thread.Sleep(100);
                    }
                }
            }
            catch(Exception e)
            {

            }
        }

 

'C#' 카테고리의 다른 글

.NET Reflection  (0) 2021.03.29
Dbset 직접 바인딩 에러 해결법  (0) 2021.02.25
외부 프로젝트 참조하기  (0) 2021.02.25
[Winform] Dock  (0) 2021.01.22
C# Dictionary  (0) 2020.11.30

선언

타입이라는 것은 변수(Int,string, char)같은 것을 말한다.

Dictionary<key 타입,value 타입> IDTable;

 

생성

IDTable = new Dictionary<key 타입, value 타입>();

 

추가

딕셔너리는 중복 키를 허용하지 않는다. 따라서, 키 값을 추가하기전 딕셔너리에 값이 이미 있는지 확인하는 조건문을 Add 함수와 같이 사용한다. ContainsKey 함수는 찾길 원하는 키가 없어도 예외를 발생시키지 않는 특성있고 사용하길 추천한다.

if (!(IDTable.ContainsKey(찾길 원하는 키)))
	IDTable.Add(Key, Value);

 

접근

foreach문을 사용하여 키값을 기준으로 값을 찾거나 value값을 기준으로 값을 찾을 수 있다.

아래 foreach 조건문에는 딕셔너리.Keys를 사용하였고 이렇게 되면 for문에 key 문자열에는 key 값이 담기게 된다.

만약 딕셔너리.Values를 사용한다면 key 문자열에는 value값이 담기게 된다.

string fake_ip ="";
if (IDTable.ContainsKey(ip))
{
	string id = IDTable[ip];
		foreach (string Key in IDTable.Keys)
		{
			if (!(ip.Equals(Key)) && IDTable[Key].Equals(id))
			{
				fake_ip = Key;
				IDTable.Remove(fake_ip);
				IDTable.Remove(ip);
				break;
			}
		}
}

 

삭제

IDTable.Remove(key값);

 

 

'C#' 카테고리의 다른 글

.NET Reflection  (0) 2021.03.29
Dbset 직접 바인딩 에러 해결법  (0) 2021.02.25
외부 프로젝트 참조하기  (0) 2021.02.25
[Winform] Dock  (0) 2021.01.22
C# Thread  (0) 2020.12.01

+ Recent posts