데이타 바인딩시 바인딩 데이타로 연산하기

protected void Page_Load(object sender, EventArgs e) { this.loadlist(); }

private void loadlist() { 데이터바인딩구문... }

protected string BindAge(object item) { string tmpAge = string.empty string birthYmd = Eval("[birthYmd]").ToString(); //

나이계산로직 tmpAge = 나이;

return tmpAge; }

--디자인페이지

<asp: 바인딩 영역>

나이:<%# BindAge(Container.DataItem)%> ...

</asp:...>

Button 클릭시 인자값 받아 처리하기

Button 클릭시 인자값 받아 처리하기

//디자인 페이지 <asp:Button ID="command_btn" runat="server" Text="Button" OnCommand="command_btn_Click" CommandArgument="1"/>

// 소스페이지

protected void Button_Command(object sender, CommandEventArgs e) {
Response.Write(e.CommandArgument.ToString());
}

////////////// 실제 응용예제

<script>
function group_delete(){
	if(confirm('삭제된 그룹은 복구되지 않습니다.\n\n삭제하시겠습니까?\n\n')){
	    return true;
	}else return false
}
</script>

//아래는 DataList 로 바인딩 된 경우 <asp:Button ID="delGroup_btn" runat="server" Text="그룹삭제" OnClientClick="return group_delete();" oncommand="delGroup_btn_Click" CommandArgument='<%# Eval("intNum")+","+Eval("gid")%>' />

// 소스페이지 protected void delGroup_btn_Click(object sender, CommandEventArgs e) { //실제적인 삭제 Process Response.Write("CommandEventArgs:"+e.CommandArgument.ToString()); }

문자열처리

출처 : http://cafe.naver.com/dptime.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=98 문자열

  • 모든 문자열은 System.String로부터 상속
  • 닷넷에서 string객체는 한번 인스턴스화가 되면 불편 -> StringBuilder사용

string선언

  • 다른 참조형과 다르게 new연산자 이용X
  • 모든 string형은 유니코드

문자열 길이

  • 객체명.Length
  • 읽기전용

문자열의 각 요소 접근하기

  • 인덱서(indexer) : 문자열을 배열처럼 취급
  • 읽기 전용

문자열의 추가

  • Insert : 지정위치에 문자열추가
  • Concat. + : 문자열합치기
  • 자기자신에게 영향X

대소문자 변환

  • ToLower : 소문자로 치환
  • ToUpper : 대문자로 치환

공백 문자열 지우기

  • Trim, TrimStart, TrimEnd
  • 공백삭제

문자열치환

  • Replace
  • 문자열 내에 원하는 문자열을 바꾸고자 하는 문자열로 치환

문자열 검색, 추출

  • IndexOf, LastIndexOf : 문자열 검색, 찾고자하는 문자열의 첫번째 글자 위치값 리턴 (0부터시작)
  • Substring : 문자열추출

문자열 포맷지정

  • Console.WriteLine()에서 사용한 양식 문자열과 동일
  • String.Format();

문자열 분할

  • Split
  • 구분자를 중심으로 문자열을 분할, 배열 형태로 반환

Equals

  • 두문자열이 같은지 비교

지정문자열 삭제

  • Remove

code -----------------------------------------------------------------------------

using System;

namespace ConsoleTest { class Class1 { public static void Main(string[]args) {
//문자열 비교 string str; string str1="ABC"; string str2="ABC";

                                   if(str1.Equals(str2))
                                            Console.WriteLine("동일");
                                   else
                                            Console.WriteLine("다름");

                                   //문자열삭제
                                   string  str3 = "나는 문자열입니다.";
                           Console.WriteLine(str3.Remove(3,4));    //3위체에서부터 4개 삭제

                                  //양식문자열
                                  //콘솔이 아닌 웹등에서 사용용이, 사용법은 WriteLine과 같음.
                                   str = String.Format("{0,10}","ABC");    
                                   Console.WriteLine(str);                 //콘솔에서는 WriteLine 사용
                                   Console.WriteLine(String.Format("{0:f2}",1520));

                                   //문자열 일정문자단위로 분리
                                  string csv = "전도환, 노테우, 김명삼, 김대증,노모현,이헤찬, 니미럴....";
                                  string [] result;

                                  result = csv.Split(',');
                                 for( int i=0; i<result.Length;i++)
                                         Console.WriteLine(result[i].Trim());

                                 //문자열길이, 복제. 비교
                                str = "가나다라마바사";
                                Console.WriteLine("문자열 : {0}", str);
                                Console.WriteLine("문자열 길이 : {0}", str.Length);
                                Console.WriteLine("문자열 복제 : {0}", str.Clone());
                                Console.WriteLine("문자열 비교 : {0}", str.Equals("ABCDE"));

                                //Indexer
                                char firstChar = str[0];
                                Console.WriteLine("첫문자 : {0}", firstChar);       // 결과 : 가

                                //문자열 추가 ( Insert )
                               str2="추가문자열";
                               str = str.Insert(0, str2);  //0번째 위치에 str2문자열 추가
                               Console.WriteLine(str);

                                //문자열 병합 ( Concat )
                                str2 = String.Concat("가","마","사");
                                Console.WriteLine(str2);
                                str2 = String.Concat(str,"마","사");
                                Console.WriteLine(str2);
                                str2 = str2 + str;
                                Console.WriteLine(str2);

                                 //대소문자 변환 ( ToLower, ToUpper )
                                  str = "Hi~ GoodMorning~";
                                 Console.WriteLine(str.ToUpper());
                                 Console.WriteLine(str.ToLower());
                                 Console.WriteLine(str);

                                //문자열 좌/우 공백제거 ( Trim )
                                str = "    열심히 공부하세요     ";
                                Console.WriteLine(">" + str.TrimStart() + "<") ;
                                Console.WriteLine(">" + str.TrimEnd() + "<");
                                Console.WriteLine(">" + str.Trim() + "<");
                                Console.WriteLine(">" + str.TrimStart().TrimEnd() + "<");

                                //문자열 치환 (Replace) 대소문자 구분한다.
                                 str = "Hello~";
                                Console.WriteLine(str);
                                Console.WriteLine(str.Replace("~", "..."));

                                //문자열 검색, 0부터 시작. 해당하는 문자열의 첫번째 위치값 리턴 ( IndexOf )
                                Console.WriteLine(str.IndexOf("공부"));

                                str = "I Love You~";

                                //문자열 추출b ( Substring )
                                Console.WriteLine(str.Substring(2));    //2번째위치부터 끝까지
                                Console.WriteLine(str.Substring(2,4));
                        }                                   
           }

}

-------------------------------------------------------------------------------------

ToCharArray

  • 문자열을 Char형의 배열 형식으로 반환합니다

code -----------------------------------------------------------------------------

using System;

namespace ConsoleTest { class Class1 { public static void Main(string[]args) {
string str = "012wxyz789"; char [] arr;

                                 arr = str.ToCharArray(3, 6);    //3번째 위치에서 6개의 글자를 추출해 배열방에 각각 넣는다.
                                 Console.Write("The letters in '{0}' are: '", str);
                                 Console.Write(arr);             //배열방 출력시 해당내용 출력

                                for( int i=0;i<arr.Length;i++)   //각각의 배열방에도 들어가 있음.
                                        Console.WriteLine(arr[i]);

                                 Console.WriteLine("'");

                                 char [] array;
                                 array = str.ToCharArray();      //인자를 써주지 않으면 모든 문자 배열에 집어넣음
                                 Console.WriteLine("Each letter in '{0}' is:", str);
                                 Console.WriteLine(array);

                                foreach (char c in arr)
                                        Console.WriteLine(c);
                        }                                   
           }

}

-------------------------------------------------------------------------------------

System.Text.StringBulider

  • 닷넷에서 String클래스를 이용한 문자열 처리는 비효율적

  • 대형 문자열이나 잦은 문자열 변경시

  • 대부분의 문자열 관련 함수들이 String 인스턴스를 새로 생성시켜 반환

    StringBulider sb = new StringBulider("ABC");

  • StringBuilder.Capacity : 객체내에 문자열 버퍼 크기

  • StringBuilder.Length : 문자열 길이

code -----------------------------------------------------------------------------

using System;

namespace ConsoleTest { class Class1 { public static void Main(string[]args) {
StringBuilder sb = new < /FONT > StringBuilder("I am a Boy", 18); // StringBuilder Test //가용량을 적어주지 않으면 기본 용량은 16이고, 기본 최대 용량은 Int32.MaxValue

                                Console.WriteLine(sb.ToString());
                                Console.WriteLine(sb.Length);
                                Console.WriteLine(sb.Capacity);
                                Console.WriteLine(sb.MaxCapacity);

                                Console.WriteLine(sb.Insert(0,"삽입"));

                                Console.WriteLine(sb.Remove(0,2));

                                Console.WriteLine(sb.Append("추가문자열"));
                                Console.WriteLine(sb.Append(5000));
                                Console.WriteLine(sb.AppendFormat("{0,10}","end"));

                                Console.WriteLine(sb[0]);
                                sb[0] = 'i';
                                Console.WriteLine(sb[0]);

                                Console.WriteLine(sb.ToString().Replace(" ",""));
                                Console.WriteLine(sb.ToString().IndexOf("Boy")); 
                          }                                   
           }

}

-------------------------------------------------------------------------------------

The name 'Session' does not exist in the current context

이 에러는 System.Web.UI. 로 부터 상속받는 webform, usercontrol 혹은 class 에서 사용하지 않을 때 발생한다. 이럴 경우 다른 경로로서 접근가능하다.

HttpContext.Current.Session["UserID"];

Unix Time 구하기

   TimeSpan ts = (DateTime.UtcNow - new DateTime(1970,1,1,0,0,0));
    double micro_unixTime = ts.TotalSeconds;
    int int_unixTime = Convert.ToInt32(ts.TotalSeconds);
    Response.Write(micro_unixTime);
    Response.Write(int_unixTime);

결과 : 1241418593.4592 결과 : 1241418593

다양한 문자열포맷(통화, 날짜..)

string.Format("{0:D} {1:F}", aa, bb); C#에서 이렇게 사용한다 숫자 0과 1은 뒤의 변수 순서이다.

D: 10진수

X: 16진수

F: 소수점

E: 지수로 표현

G: 정수형이나 소스

N: 콤마(,) 표시

C: 통화 화폐 단위

string aa = String.Format("{0:00}-{1:###,###}-{2:0000000}", 1, 200000, 3); // 01-200,000-0000003

// reader["price"].ToString() : 1000 일경우 str_price = string.Format("{0:###,###}", Int16.Parse(reader["price"].ToString())); 1,000

str_price = string.Format("{0:000000}", Int16.Parse(reader["price"].ToString())); 001000

str_price = string.Format("{0:N}", Int16.Parse(reader["price"].ToString())); 1,000.00

str_price = string.Format("{0:C}", Int16.Parse(reader["price"].ToString())); ₩1,000

더 상세한 내용은 http://gaedong2.tistory.com/236 참조

DropDownList 에 다양한 데이타 바인딩 하기

DropDownList 에 다양한 데이타 바인딩 하기 <asp:DropDownList ID="select_category1" runat="server"> </asp:DropDownList>

  1. 배열에서 Biding 하기 foreach (string value in mail_arr()) select_tmpmail.Items.Add(value);

1.1 loop 문을 이용하기 for(int i = 1; i<=5 ; i++){ select_opcnt.Items.Add(i.ToString()); }

  1. SqlDataReader 로서 Binding 하기 SqlConnection Con = new SqlConnection(connectionString); SqlCommand Cmd = new SqlCommand(); Cmd.CommandText = "select [gid] from [wiztable_group_config]"; try { Cmd.Connection = Con; Con.Open();

     SqlDataReader reader = Cmd.ExecuteReader(CommandBehavior.CloseConnection);
    
     // 바인딩하기
     select_gid.DataSource = reader;
     select_gid.DataTextField = "gid";
     select_gid.DataValueField = "gid";
     select_gid.DataBind(); // 바인딩
     reader.Close();
     select_gid.SelectedItem.Value = gid;
    

    } catch (Exception err) { Response.Write(err.Message); } finally { Cmd.Connection.Close(); Cmd.Dispose(); if (Con.State == ConnectionState.Open) Con.Close(); Cmd = null; Con = null;
    }

  2. DataSet 으로 바인딩 하기 // 데이타를 DataSet으로 저장 Con = new SqlConnection(ConnectionStr); Con.Open(); SqlDataAdapter adapter = new SqlDataAdapter(); adapter.SelectCommand = new SqlCommand(strSQL, Con);

    DataSet ds = new DataSet(); adapter.Fill(ds); adapter = null; Con.Close();

    // 바인딩하기 select_gid.DataSource = ds; select_gid.DataTextField = "gid"; select_gid.DataValueField = "gid"; select_gid.DataBind(); // 바인딩

  3. DataTable을 이용한 직접 제어 protected void getInit() {

     select_order.DataSource = CreateDataSource();
     select_order.DataTextField = "OrderTextField";
     select_order.DataValueField = "OrderValueField";
     select_order.DataBind();
    

    }

    ICollection CreateDataSource() {

     DataTable dt = new DataTable();
    
     // Define the columns of the table.
     dt.Columns.Add(new DataColumn("OrderTextField", typeof(String)));
     dt.Columns.Add(new DataColumn("OrderValueField", typeof(String)));
    
     // Populate the table with sample values.
     dt.Rows.Add(CreateRow("정렬방식선택", "", dt));
     dt.Rows.Add(CreateRow("상품등록순", "uid/desc", dt));
     dt.Rows.Add(CreateRow("저가격순", "price/asc", dt));
     dt.Rows.Add(CreateRow("고가격순", "price/desc", dt));
     DataView dv = new DataView(dt);
     return dv;
    

    }

    DataRow CreateRow(String Text, String Value, DataTable dt) {

     DataRow dr = dt.NewRow();
     dr[0] = Text;
     dr[1] = Value;
    
     return dr;
    

    }

DropDownList의 Text값 선택: DropDownList1.Items.FindByText(string text value).Selected = true ; DropDownList의 Value값 선택: DropDownList1.Items.FindByValue(string key value).Selected = true ;

간단한 형 변환

int a = 0; string b = "333";

Parse 메소드 사용 a = Int32.Parse(b); //String to Int

toString 메소드 사용 b = a.ToString();// Int to String

Convert 를 이용한 형변환 a = Convert.ToInt32(b); //String to Int b = Convert.ToString(a);// Int to String

float f = 3.24f; byte[] byteTemp = new byte[4];

byteTemp = BitConverter.GetBytes(f);//float->byte[]으로 컨버트하는건 f = BitConvert.ToSingle(byteTemp, 0); //byte[]->float으로 컨버트하는건

ModalDialog 를 이용한 우편번호 검색

-------부모창 스크립트

<script type="text/javascript">

    function fnsearch() {
        var rgParams = new Array();
        rgParams["zipcode"] = null;

        var sUrl = "Pop_Search.aspx";
        fn_OpenModalDialog(sUrl, rgParams, "500", "400");   //모달창 오픈 함수

        if (rgParams["zipcode"] == null) {
            document.getElementById("<%=txtZipcode.ClientID %>").value = "";
            document.getElementById("<%=txtAddr1.ClientID %>").value = "";            		
        }
        else {
            document.getElementById("<%=txtZipcode.ClientID %>").value = rgParams["zipcode"];
            document.getElementById("<%=txtAddr1.ClientID %>").value = rgParams["addr1"];              
            
        }
        
    }
    
    function fn_OpenModalDialog(sUrl, sParam, width, height) {
        try {
            var strRetur = "";

            var winx = (screen.width - width) / 2;
            var winy = (screen.height - height) / 2;
            var settings = "dialogHeight:    " + height + "px; ";
            settings += "dialogWidth:     " + width + "px; ";
            settings += "dialogTop:       " + winy + "px; ";
            settings += "dialogLeft:      " + winx + "px; ";
            settings += "scroll    :yes; ";
            settings += "resizable :no; ";
            settings += "help      :no; ";
            settings += "status    :no; ";
            settings += "unadorned:yes";

            strReturn = window.showModalDialog("ModalDialog.htm?" + sUrl, sParam, settings);

            return strReturn;

        }
        catch (exceiption) {
            alert(exception.description);
        }
    }
</script>

----ModalDialog.htm

<html>
<head>
    <title></title>

<script language="javascript">
    function WindowOnLoad() {
        // Parameter로 받은 값으로 Popup Frame을 연다.
        var strUrl;
        try {
            strUrl = document.location.search;
            window.frames["PopupFrame"].document.location.href = strUrl.substring(1);
        }
        catch (exception) {
            alert(exception.description);
        }
    }
 </script>


</head>

<body topmargin="0" leftmargin="0" rightmargin="0" bottommargin="0" onload="WindowOnLoad()">
    <iframe id="PopupFrame" width="100%" height="400" frameborder=0 marginheight="0" marginwidth="0" scrolling="auto"></iframe>
</body>

</html>

-- 우편번호 검색

<script type="text/javascript">

        function fncSelect(zipcode, addr1) {
            parent.dialogArguments['zipcode'] = zipcode;
            parent.dialogArguments['addr1'] = addr1;            
            window.close();
        }
        
    </script>



검색나온 각 리스트 링크
	fncSelect(zipcode, addr1)

ASP.NET 유효성 검사 컨트롤(CustomValidator 를 사용하여 자바스크립트 직접제어)

아래는 실질적인 예입니다. ############### sample.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="sample.aspx.cs" Inherits="sample" %>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
</head>
<script type="text/javascript">
    function checkForm(source, arguments) {
       if(document.getElementById("<%=TextBox1.ClientID %>").value == ""){
		    alert("text1을 입력해주세요");
		    document.getElementById("<%=TextBox1.ClientID %>").focus();
		    arguments.IsValid = false;
		    arguments.ErrorMessage = "text1을 입력해주세요";
        }else if(document.getElementById("<%=TextBox2.ClientID %>").value == ""){
	    alert("text2를 입력해주세요");
		    document.getElementById("<%=TextBox2.ClientID %>").focus();
		    arguments.IsValid = false;
        }else{
            arguments.IsValid = true;
        }
}
</script>

<body>
    <form id="form1" runat="server">
<div>
        <h3>CustomValidator 예제</h3>
        
        text1 : 
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

        <br />
          text2 : <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
         <br />
                <asp:CustomValidator ID="CustomValidator1" runat="server" 
            ClientValidationFunction="checkForm" ErrorMessage="CustomValidator" 
            Display="None"></asp:CustomValidator>
        <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
    </div>

    </form>
</body>
</html>

############### sample.aspx.cs

using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq;

public partial class sample : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) {

}
protected void Button1_Click(object sender, EventArgs e)
{
    if (Page.IsValid) 
    {
        Response.Write("이곳에 실행문 입력");
    }
}

}

주의 사항

checkForm(source, arguments)에서처럼 arguments 작성후 arguments.IsValid = false; 를 직접제어

아래 자료 출처 : http://thankee.tistory.com/28

입력체크나 옳바른값인지 검사하는 일등의 유효성 검사는 클라이언트 자체에서 충분히 가능합니다. 보통 이런 클라이언트 측에서 유효성 검사는 자바스크립트가 담당하였는데, 유효성 검사에 필요한 컨트롤의 종류가 많으면 많을수록 자바스크립트 코드도 엄청나게 늘어나버립니다. 또한 스크립트이기에 어쩔수 없이 디버그나 유지보수가 쉽지 않았기 때문에 많은 개발자나 학생들에게 부담이 되었던 것이 사실입니다. 이러한 지루하고 또는 반복적인 노동이 될 수 밖에 없는 유효성 검사부분에 대해 ASP.NET에서는 유효성 검사 컨트롤을 제공하고 있습니다.

ASP.NET에서 제공하는 유효성 검사 컨트롤의 종류는 다음과 같습니다.

  • RequiredFieldValidator : 값 입력여부를 검사합니다.
  • RangeValidator : 값이 특정범위에 있는지 검사합니다.
  • RegularExpressionValidator : 지정한 표현식과 패턴이 일치하는지 검사합니다.
  • CompareValidator : 값을 지정한 다른 값과 비교합니다.
  • CustomValidator : 사용자 지정 유효성 검사로직을 이용하여 검사합니다.
  • ValidationSummary : 여러 유효성 검사 컨트롤들의 검사 결과를 모아서 출력할 수 있도록 지원합니다.
  1. RequiredFieldValidator : 지정한 컨트롤의 값 입력 여부를 체크합니다.

    • ControlToValidate : 검사 대상 컨트롤을 지정합니다.
    • EnableClientScript : 클라이언트 측 스크립트(JavaScript나 VbScript를 칭합니다.)를 사용할지 여부를 지정합니다. False로 지정할 경우, 서버로 해당 페이지 전송을 통해 유효성 검사를 하게 됩니다.
    • ErrorMessage : ValidationSummary를 사용할 경우, 이 ValidationSummary에 출력될 에러 메세지를 지정하는 속성입니다. Text 속성 값을 지정하지 않을 경우, 이 값이 Text값을 대신하게 됩니다.
    • Text : 출력될 에러 메세지를 지정하는 속성입니다.
    • InitialValue : 여기서 지정한 값과 같을 경우, 에러메세지를 나타내게 됩니다. 기본값은 공란입니다.
    • Display : 에러 메세지를 출력하는 방법에 대한 설정입니다.(Default값은 Dynamic입니다.)
      • None : 에러 메세지를 출력하지 않습니다.
      • Static : 에러 메세지가 출력되어야 할 때 공간을 차지하게 됩니다.
      • Dynamic : 에러메시지가 출력되든 되지 않든 공간을 차지하고 있게 됩니다.
    • SetFocusOnError : 에러가 발생한 경우, 해당 컨트롤에 포커스를 둘지 여부입니다.
    • ValidationGroup : PostBack를 발생시키는 컨트롤이 PostBack를 시도하려고 할 때, ValidationGroup이 같은 유효성 검사 컨트롤이 작동하게 됩니다. PostBack를 발생시키는 컨트롤은 대표적으로 Button계열 컨트롤이나, AutoPostBack 속성이 있는 컨트롤을 말합니다. 버튼에 ValidationGroup를 지정하고, 각 유효성 검사 컨트롤에 같은 ValidationGroup를 지정하면, 버튼이 클릭되어 PostBack이 발생하기 전에 같은 그룹의 유효성 검사 컨트롤을 동작시킵니다.
  2. CompareValidator : 지정한 컨트롤 또는 값과 비교하여 유효성 검사를 합니다.

    • ControlToCompare : 비교대상 컨트롤을 지정합니다.
    • CultureInvariantValues : 유효성 검사를 시작하기 전에 Culture중립 코드로 변환할 지 여부를 결정합니다. Culture란 지역화된 언어나 표현정보들을 말하는 것으로서, CultureInfo.CurrentCulture로서(using System.Globalization;선언 필요) 현재 Culture를 확인할 수 있습니다. Culture는 '언어코드-지역 또는 국가코드'로 구성됩니다. 한국의 경우 ko-KR로서 한국어-한국지역을 나타냅니다. Culture중립코드란 ko에 해당하는 부분으로서 지역 또는 국가코드를 제외한 Culture코드를 말합니다.
    • Operator : 비교 식을 지정합니다. Equal, NotEqual, GreaterThan, LessThan, DataTypeCheck... 등등이 있습니다. 여기서 지정한 식이 거짓이되면 에러 메세지를 나타내게 됩니다. 여기서 DataTypeCheck는 데이터 타입이 같은지 여부를 판단하는 것입니다.
    • Type : 비교할 값의 데이터 형식입니다.
    • ValueToCompare : 비교할 값을 지정하는 속성입니다. ControlToCompare 속성과 중복 지정 가능합니다.
  3. RangeValidator : 특정 범위 내의 값인지 검사를 합니다.

    • MaximumValue : 최대값을 지정합니다.
    • MinimumValue : 최소값을 지정합니다.
    • Type : Type는 검사할 데이터 자료형을 결정하는 것입니다. 기본값은 String로서 이 속성을 그대로 두고 1~100까지 숫자를 체크하게 되면, 옳바른 결과를 얻을 수 없습니다.(문자열 비교를 하게 되므로) 따라서 사용하고자하는 데이터 타입을 반드시 지정해 주시기 바랍니다.
  4. ValidationSummary : 해당 페이지의 모든 유효성 검사 컨트롤의 유효성 검사 결과 메시지를 모아서 출력해주는 기능을 합니다. 한 곳에 모든 에러메세지를 표현할 경우 유용합니다.

    • HeaderText : ValidationSummary의 제목을 표시합니다.
    • ShowMessageBox : 메세지박스를 이용하여 에러메세지를 출력할지 여부를 지정합니다.
    • DisplayMode : 해당 페이지의 에러 메세지들을 출력할 방법을 결정합니다. BulletList, List, SingleParagraph 등이 있습니다.
    • ShowSummary : 해당 페이지의 에러 메세지를 페이지에 텍스트로서 출력할 지 여부를 지정합니다.
    • ValidationGroup : 그룹을 지정하면, 같은 그룹내의 오류 정보만을 출력합니다.
  5. RegularExpressionValidator : 사용자가 지정한 표현식과 패턴이 일치하는지 여부를 검사합니다.

    • ValidationExpression : 검사할 표현식을 지정합니다. 정규식 편집기를 제공함으로서 간편하게 원하는 표현식을 정할 수 있습니다. 실제 정규식 작성법은 웹사이트나 msdn을 참고하도록합니다. (한글 정규식 설명 msdn사이트 : http://www.microsoft.com/korea/msdn/library/ko-kr/dev/aspdotnet/regexnet.aspx)
      • 주민등록번호의 경우 간단하게 작성되어 있는데, 다음과 같이 개선될 수 있다. \d{2}[0-1]\d{1}[0-3]\d{1}-[1-4]{6}
  6. CustomValidator : 사용자가 작성한 유효성 검사 구문을 사용하는 컨트롤입니다. 함수를 작성해서 그 함수를 컨트롤에 할당해 주는 방식을 취하는데, 특별히 신경써야할 부분은 함수를 작성할 때 예외처리를 확실하게 해주는 것입니다.(예로 숫자를 입력해야하는데 문자열을 입력한 경우)

    • ClientValidationFunction : 자바스크립트로 작성된 유효성 검사 함수 이름을 지정하는 속성입니다. 자바스크립트 함수 작성 규칙은 다음과 같습니다.

      1. 두개의 매개변수를 받도록 합니다.(첫번째는 유효성 검사 컨트롤, 두번째는 유효성을 검사할 값과 그 결과를 저장할 변수가 포함되어 있습니다.)
      2. '두번째매개변수.Value'에 포함된 값을 체크함으로서 유효성 검사를 합니다.
      3. 유효성 검사 결과를 '두번째매개변수.IsValid'에 저장합니다.
    • ValidateEmptyText : 검사할 컨트롤의 값이 비엇을 때 유효성 검사를 할지 여부를 지정합니다.

    • OnServerValidate : aspx파일의 소스 페이지에서 추가할 수 있는 이벤트로서, 서버에서 유효성 검사가 요청될 경우(예 : 수동으로 Page.Validate(); 메서드를 호출할 경우)발생하는 이벤트입니다. 이 이벤트에 메서드를 지정하고, 다음과 같은 메서드를 작성하시면 됩니다. 서버 측에서 모든 유효성 검사가 끝난 후 결과 값은 Page.IsValid;에 저장되어 있습니다. public void 메서드명(object source, ServerValidateEventArgs args) { //첫번째 매개변수는 검사 대상 객체를 전달 받습니다. //두번째 매개변수는 유효성을 검사할 값과, 유효성검사결과를 받는 변수가 포함되어있습니다. //따라서 유효성 검사 코드는 다음과 같이 될 수 있습니다. if(int.Parse(args.Value) % 2 == 0) args.IsValid = true; //IsValid에 true 또는 flase를 할당함으로서 검사 통과여부를 알릴수 있습니다. else args.IsValid = false; }

App_Code 디렉토리(두가지 언어 사용)

App_Code 디렉토리(두가지 언어 사용)

출처 : http://cafe.naver.com/gplab/8

[App_Code]

bin 디렉토리는 이미 컴파일된 어셈블리 파일을 저장하는 반면, 'App_Code' 디렉토리는 응용 프로그램 실행 시에 동적으로 컴파일될 소스 파일을 저장하는데 사용한다.

'App_Code' 디렉토리에 두 가지 이상의 언어로 작성된 소스를 저장할 경우 지켜야 할 규칙

  1. 동일한 디렉토리에 둘이상의 소스 파일이 존재하면 안된다. 즉 서로 다른 디렉토리에 존재해야한다.

예 ) App_code /CS class.cs /VB class.vb

  1. web.config 파일의 compliation 에 <codeSubDirectories> 섹션을 추가해 다른언어를 사용하는 디렉토리 지정 (디렉토리가 어떤 언어를 사용하는지 명시하지 않음)
<compilation>
     <codeSubDirectories>
          <add directoryName="CS">
          <add directoryName="VB">
     </codeSubDirectories>
</compilation>

팝업에서 opener로 값 전달

팝업에서 opener로 값 전달

팝업에서 오프너로 값을 전달할 경우 기존 스크립트와 차이가 있다.

그중하나는 openr가 단순한 aspx 가 아니라 ascx나 혹은 master등을 가지거나 ... 하는 경우로 해서 input 옵션등에 ctl이 붙는 경우 이다.

이경우는 타켓필드를 오프너에서 보내주는 것이 유리하다.

아래는 간단한 샘플소스이다. (예) 우편번호 찾기

opener.ascx --------------

<script>
function OpenZipcode(flag){
	if(flag == 1){
		window.open("./util/zipcode/<%=ZipCodeSkin %>/index.aspx?zip1=<%=input_zip1_1.ClientID %>&zip2=<%=input_zip1_2.ClientID %>&firstaddress=<%=input_address1.ClientID %>&&secondaddress=<%=input_address2.ClientID %>","ZipWin","width=367,height=300,toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=no");
	}
}
</script>

<asp:TextBox ID="input_zip1_1" runat="server"></asp:TextBox>
                    -
                    <asp:TextBox ID="input_zip1_2" runat="server"></asp:TextBox>
                    <a href="javascript:OpenZipcode('1');">
                        <asp:Image ID="Image2" runat="server" ImageUrl="images/but_post.gif" /></a>&nbsp;<br> 
                    <asp:TextBox ID="input_address1" runat="server"></asp:TextBox> 
                    <br> 
                    <asp:TextBox ID="input_address2" runat="server"></asp:TextBox>
                    (상세주소)<br>

상기처럼 실제 ID는 input_zip1_1, input_zip1_2.. 등등이라고 하더라도 web브라우저상에서는 ctl02_input_zip1_1.. 처럼 보여짐으로서 이런 필드를 <%=input_zip1_1.ClientID %>등을 이용해서 함깨 넘긴다.

popu.aspx ----------------

<SCRIPT language=JavaScript>
<!--
function Copy(zip,address) { 

    opener.document.getElementById("<%=zip1 %>").value = zip.substring(0,3);
	opener.document.getElementById("<%=zip2 %>").value = zip.substring(4,zip.length);	
	opener.document.getElementById("<%=firstaddress %>").value = address;
	opener.document.getElementById("<%=secondaddress %>").focus();
	top.window.close();	
//opener.document.getElementById("input_address1").value = address;
}
//-->
</SCRIPT>

--일부 발췌
              <ItemTemplate>
                <a href="javascript: Copy('<%# DataBinder.Eval(Container.DataItem, "zipcode")%>','<%# DataBinder.Eval(Container.DataItem, "sido")%> <%# DataBinder.Eval(Container.DataItem, "gugun")%> <%# DataBinder.Eval(Container.DataItem, "dong")%>')"> <%# DataBinder.Eval(Container.DataItem, "zipcode")%> <%# DataBinder.Eval(Container.DataItem, "sido")%> <%# DataBinder.Eval(Container.DataItem, "gugun")%> <%# DataBinder.Eval(Container.DataItem, "dong")%> </a>
              </ItemTemplate>

상기처럼 getElementById로서 그 값을 전달한다.

DataBinder 에 관한 몇가지

DataBinder 성능최적화 DataBinder.Eval method 는 복잡한 식을 쓰는 수고를 덜어주지만, 이 method의 사용은 late-bound에 의해 성능이 떨어지는 단점이 있다. 따라서 DataBinder.Eval을 명시적인 cast로 바꾸면 된다. <%# DataBinder.Eval(Container.DataItem, “myField”,“{0:c}”) %> ===> <%# String.Format(“{0:c}”,(CType(Container.DataItem,DataRowView)(“myField”))) %>

2.0 이후 버젼과 1.0버전 바인딩식 변경

1.0 : <%# DataBinder.Eval(Container, "DataItem.user_id") %> <%# DataBinder.Eval(Container. DataItem,"user_id") %>

2.0이후 : 상기처럼도 사용가능하나 아래와 같이도 사용됨 <%# Eval("user_id") %>

DataBinder.Eval 메소드 세번째 인자로 결정하는 문자열 포멧 C 또는 c // 통화 포멧 ex) 1,234.60 D 또는 d // 십진수 ex) 235, 50 E 또는 e // 과학계산용 지수 ex) 123E+21, -1.4e+3 F 또는 f // 고정소수점 ex) 34.500, -0.0123 N 또는 n // 숫자 ex) 3,456.23, -5,423 P 또는 p // 퍼센트 ex) 10%, 35.5% X 또는 x // 16진수 ex) &H3f46, 0x4618

d // 2008-01-01 D // 2008년 1월 1일 월요일 f // 2008년 1월 1일 월요일 오전 12:00 F // 2008년 1월 1일 월요일 오전 12:00:00 t // 오전 12:00 T // 오전 12:00:00 Y 또는 y // 2002년 6월

숫자

DataBinder.Eval(Container.DataItem, "price", "$ {0:D}") 날짜

DataBinder.Eval(Container.DataItem, "pubdate", "{0:f}")

SqlDataReader를 얻기 위한 절차

SqlDataReader를 얻기 위한 절차

  1. 네임스페이스 명시 using System.Data.SqlClient;
  2. Connection 객체 생성 : 생성자에게 연결 정보 전달, 연결 프로퍼티 설정 SqlConnection conn = new SqlConnection(Server=localhost; user id=sa; password=; database=northwind");
  3. Connecton 연결 conn.Open();
  4. Command 객체 생성 : 실행할 쿼리와 Connection을 인수로 함 SqlCommand comm = new SqlCommand("select * from 테이블명", conn);
  5. 데이터 읽어오기 SqlDataReader reader = comm.ExecuteReader();
  6. 작업수행
  7. 연결 닫기 conn.Close();

데이터베이스 Connection 생성과 Open string conStr = "Server=localhost;user id=sa;password=;database=northwind"; string query = "select * from Address where addr=@addr1 or addr=@addr2"; SqlConnection conn = new SqlConnection(conStr); conn.Open();

Command 생성과 Parameter 타입 지정 SqlCommand comm = new SqlCommand(query, conn); comm.Parameters.Add("@addr1", SqlDbType.Char); comm.Parameters.Add("@addr2", SqlDbType.Char);

Command의 Parameter 값 설정 comm.Parameters["@addr1"].Value = "서울시"; comm.Parameters["@addr2"].Value = "대전시";

데이터 읽어오기 SqlDataReader sr = comm.ExecuteReader(); while(sr.Read()){ Console.WriteLine(sr.GetInt32(0)+"|"+ sr.GetString(1).Trim()+"|"+ sr.GetString(2) ); }

SqlDataReader와 Connection 닫기 sr.Close(); conn.Close();

javascript(자바스크립트) 호출

aspx 파일의 디자인 페이지에서 스크립트 입력

<script>
function testfnc(0{
  alert('테스트');
}
</script>

cs파일에서 이벤트 발생시 아래 코드중 택일 입력 주로 상기 스크립트를 실행하기 위해서는 RegisterStartupScript 를 이용하는 것이 좋습니다.

Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "aa", ""); Page.ClientScript.RegisterStartupScript(this.GetType(), "aa", ""); Page.RegisterClientScriptBlock("ButtonClickTest", ""); Page.RegisterStartupScript("ButtonClickTest", ""); RegisterClientScriptBlock 함수는 서버 Form 시작 부분의 바로 아래줄에 생성 RegisterStartupScript 함수는 서버 Form 닫히는 부분의 바로 윗줄에 생성

post 방식으로 값 전달(PostBackUrl)

<asp:ImageButton ID="btnOK" runat="server" PostBackUrl="타겟파일" />

페이지(Page)이벤트 & Page.IsPostBack 프로퍼티

페이지(Page)이벤트

Page객체가 읽혀질 때마다 Page_Load 이벤트가 발생하며 이 이벤트에 대한 핸들러를 작성하므로써 페이지 초기화 작업을 수행할 수 있다. 예를 들어 이 이벤트 내에서 데이터베이스에 쿼리문을 실행하여 그 결과를 페이지에 반영하는데 사용할 수 있다. 그리고 페이지의 모든 작업을 수행한 뒤에는 Page_Unload 이벤트가 발생한다. 이는 마치 객체지향 프로그래밍에서 클래스 생성자(constructor)와 소멸자(destructor)의 역할과 비슷하다고 할 수 있겠다.

Page.IsPostBack 프로퍼티

Page_Load 이벤트는 페이지가 읽혀질 때마다 발생하기 때문에 그 때마다 페이지를 초기화하는 작업을 수행하는 것은 낭비일 수 있다. 웹 환경에서는 클라이언트와 웹 서버사이에 라운드 트립이 자주 발생하므로 이러한 페이지 초기화 작업은 매우 비효율적이다. 특히 페이지 초기화를 위해서 데이터베이스에 여러 쿼리문을 실행시키고 많은 양의 데이터를 랜더링해야 한다면 웹 서버와 데이터베이스 서버 그리고 네트워크 부하등 많은 부분에서 리소스를 낭비하게 된다.

이 문제를 해결하기 위해서 Page 클래스는 IsPostBack이라는 불린(Boolean)형 프로퍼티를 제공하는데 이 값이 True면 해당 페이지는 이미 렌더링된 페이지가 사용자에 의해서 다시 호출된 것을 의미한다. 따라서 다음과 같이 코드를 작성하면 페이지가 처음 호출되었을 때만 페이지의 초기화 작업을 수행함으로써 서버의 부하를 줄일수 있다.

Page 클래스의 IsPostBack의 값이 True일 때에는 데이터베이스를 사용하지 않고 각 컨트롤에 저장된 상태 값(viewstate)을 이용해서 페이지를 구성하게 된다. 이것은 컨트롤들이 자신의 값을 기억하고 있다는 의미이다. 하지만 웹 환경은 상태 값을 보존하지 않는 stateless환경이지 않은가?

어디에 이러한 상태값을 저장한다는 말인가?

각 서버 컨트롤들의 상태 값이 인코딩된 상태로 hidden태구의 값으로 저장된다.

랜더링된 html페이지 소스에서 _VIEWSTATE값을 디코딩해서 페이지에 포함된 서버 컨트롤의 값을 초기화하게 되는 것이다.

[출처] : http://blog.naver.com/eomjang?Redirect=Log&logNo=20005186595

[팁]DropDownList에서 onselectedindexchanged을 해도 이벤트가 실행이 안될때

[팁]DropDownList에서 onselectedindexchanged을 해도 이벤트가 실행이 안될때

DropDownList의 속성창에서 AutoPostBack -> True로 설정 혹은 DropDownList객체.AutoPostBack = True;

DropDownList 에 Binding(바인딩) 하기

DropDownList 에 Binding(바인딩) 하기 (두가지 방법으로 데이타 처리)

sample1)

    protected void getSelectGid()
    {
            SqlConnection Con = new SqlConnection(connectionString);
            SqlCommand Cmd = new SqlCommand();
            Cmd.CommandText = "select [gid] from [wiztable_group_config]";
            try
            {
                Cmd.Connection = Con;
                Con.Open();

                SqlDataReader reader = Cmd.ExecuteReader(CommandBehavior.CloseConnection);


                select_gid.DataSource = reader;
                select_gid.DataTextField = "gid";
                select_gid.DataValueField = "gid";
                select_gid.DataBind(); // 바인딩
                reader.Close();
                select_bid.Items.FindByValue(bid).Selected;//로딩후 바로 실렉트 할경우
            }
            catch (Exception err)
            {
                Response.Write(err.Message);
            }
            finally
            {
                Cmd.Connection.Close();
                Cmd.Dispose();
                if (Con.State == ConnectionState.Open) Con.Close();
                Cmd = null;
                Con = null;                
            }

    }

sample2)

protected void getSelectGid()
        {
            string connectionString = "db정보";
            SqlConnection Con =new SqlConnection(connectionString);
            string query = null;
            try
            {
                SqlDataAdapter adapter =new SqlDataAdapter();
                Con.Open();
                strQry = "select  ....";
                Cmd.SelectCommand =new SqlCommand(strQry, Con);

                DataSet ds = new DataSet();
                adapter.Fill(ds,"MccMenu"); //
                DropDownList1.DataSource = ds.Tables["가상테이블"];
                //Value 값
                DropDownList1.DataValueField = ds.Tables["가상테이블"].Columns[0].ColumnName;
                //Text 값
                DropDownList1.DataTextField = ds.Tables["가상테이블"].Columns[1].ColumnName;
                DropDownList1.DataBind();
            }
            catch (Exception err)
            {
                
            }
            finally
            {
                con.Close();
            }
        }

///////////// 다음예는 Binding 및 특정값을 실렉트 하는 예제입니다. //실제 폴더의 목록을 가져와 하는 부분인데 앞단은 생략

    protected void readSkinFolder(string selected)
    {
        utility util = new utility();
        string folderPath = PATH_SYSTEM + "wizboard\\skin\\";
        string[] sFolders = util.getFolderList(@folderPath);
        foreach (string sFolder in sFolders)
        {
            select_setskin.Items.Add(sFolder.ToString());
        }
        select_setskin.Items.FindByText(selected).Selected = true;

    }

상기처럼 현재 값 "(selected)."을 가져와서 아래처럼 처리 하면 ok입니다. select_setskin.Items.FindByText(selected).Selected = true;

//////////// loop 문 등을 이용하여 데이타 바로 데입 ////////////

                ArrayList memberMode = new ArrayList();
                for (int i = 0; i <= 11; i++)
                {
                    memberMode.Add(i);
                   
                }
                select_memberonly_writemode.DataSource = memberMode;
                select_memberonly_writemode.DataBind();
            
                select_memberonly_writemode.Items.FindByValue(memberonly[0]).Selected = true;

범용 클래스 제작 방법

범용 클래스 제작 방법

솔루션 탐색기 -> 새항목 추가 -> 클래스 를 누르면 App_Code 라는 폴더가 생성되고 XX.cs 파일이 생성

##################

첫번째 예

################## XX.cs

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;

namespace myutil
{   
    public class firstutil 
    {
        private string myValue;

        public firstutil()
        {
            myValue  = "폰돌";
        }

        public string sample()
        {

            return this.myValue;
        }

        
    }
}

이젠 일반 aspx 파일을 만들자.

my.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="my.aspx.cs" Inherits="myAspx" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
    </div>
    </form>
</body>
</html>

my.aspx.cs

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using myutil;

public partial class myAspx : System.Web.UI.Page
{

    protected void Page_Load(object sender, EventArgs e)
    {

        firstutil util = new firstutil();
        Response.Write("my name is " + util.sample());

    }

}

[결과] my name is 폰돌

A potentially dangerous Request.Form value was detected from the client

A potentially dangerous Request.Form value was detected from the client : 악성코드의 삽입(iframe 혹은 script)을 막기위해 html 태그를 막음으로서 html 입력시 상기와 같은 에러 발생 참조 : http://www.asp.net/learn/whitepapers/request-validation/

예1) 페이지 마다 걸기

<%@ Page validateRequest="false" %>

예2_1) web.config 수정하기(한번으로 전체 페이지 적용)

<configuration>
   <system.web>
      <pages validateRequest="false" />
   </system.web>
</configuration>

액세스 한정자(public,protected,Internal,private)

액세스 한정자(C# 참조)

public: 액세스가 제한되지 않습니다.

protected: 포함하는 클래스 또는 여기에서 파생된 형식으로 액세스가 제한됩니다.

Internal: 액세스가 현재 어셈블리로 제한됩니다.

protected internal: 현재 어셈블리 또는 포함하는 클래스에서 파생된 형식으로 액세스가 제한됩니다.

private: 액세스가 포함하는 형식으로 제한됩니다.

// Public access / /public 키워드는 형식 및 형식 멤버에 대한 액세스 한정자입니다. 공용 액세스는 허용도가 가장 높은 액세스 수준입니다. 다음 예제처럼 public 멤버는 액세스에 제한이 없습니다.

using System;
class Point
{
    public int x; 
    public int y;
}

class MainClass
{
    static void Main() 
    {
        Point p = new Point();
        // Direct access to public members:
        p.x = 10;
        p.y = 15;
        Console.WriteLine("x = {0}, y = {1}", p.x, p.y); 
    }
}

[결과] x = 10, y = 15

// Protected access //protected 키워드는 멤버 액세스 한정자입니다. 보호된 멤버는 해당 클래스 내에서와 파생 클래스에서 액세스할 수 있습니다.

using System;
class A
{
    protected int x = 123;
}

class B : A
{
    static void Main()
    {
        A a = new A();
        B b = new B();

        // Error CS1540, because x can only be accessed by
        // classes derived from A.
        // a.x = 10; 
        
        // OK, because this class derives from A.
        b.x = 10;   
    }
}
// 에러 발생

// protected_keyword_2.cs

using System;
class Point 
{
    protected int x; 
    protected int y;
}

class DerivedPoint: Point 
{
    static void Main() 
    {
        DerivedPoint dp = new DerivedPoint();

        // Direct access to protected members:
        dp.x = 10;
        dp.y = 15;
        Console.WriteLine("x = {0}, y = {1}", dp.x, dp.y); 
    }
}출력
x = 10, y = 15

다음 예제에는 두 개의 파일 Assembly1.cs 및 Assembly2.cs가 포함되어 있습니다. 첫 번째 파일에는 내부 기본 클래스 BaseClass가 있습니다. 두 번째 파일에서 BaseClass를 인스턴스화하려고 시도하면 오류가 발생합니다.

코드 복사

// Assembly1.cs
// compile with: /target:library
internal class BaseClass 
{
  public static int intM = 0;
} 코드 복사
// Assembly1_a.cs
// compile with: /reference:Assembly1.dll
class TestAccess 
{
  static void Main() 
  {
     BaseClass myBase = new BaseClass();   // CS0122
  }
}

다음 예제에서는 예제 1에 사용한 것과 같은 파일을 사용하되 BaseClass의 액세스 수준을 public으로 변경합니다. 또한 IntM 멤버의 액세스 수준을 internal로 변경합니다. 이 경우 클래스를 인스턴스화할 수는 있지만 내부 멤버에 액세스할 수는 없습니다.

코드 복사 // Assembly2.cs // compile with: /target:library public class BaseClass { internal static int intM = 0; } 코드 복사 // Assembly2_a.cs // compile with: /reference:Assembly1.dll public class TestAccess { static void Main() { BaseClass myBase = new BaseClass(); // Ok. BaseClass.intM = 444; // CS0117 } }


이 예제에서 Employee 클래스에는 name과 salary라는 두 개의 전용 데이터 멤버가 포함되어 있습니다. 멤버 메서드를 제외하고는 전용 멤버에 액세스할 수 없으므로 전용 멤버에 대한 액세스를 제어할 수 있도록 GetName 및 Salary라는 공용 메서드를 추가합니다. name 멤버에는 공용 메서드를 통해 액세스하고 salary 멤버에는 읽기 전용인 공용 속성을 통해 액세스합니다. 자세한 내용은 속성(C# 프로그래밍 가이드)을 참조하십시오.

코드 복사 // private_keyword.cs

using System;
class Employee
{
    private string name = "FirstName, LastName";
    private double salary = 100.0;

    public string GetName()
    {
        return name;
    }

    public double Salary
    {
        get { return salary; }
    }
}

class MainClass
{
    static void Main()
    {
        Employee e = new Employee();

        // The data members are inaccessible (private), so
        // then can't be accessed like this:
        //    string n = e.name;
        //    double s = e.salary;

        // 'name' is indirectly accessed via method:
        string n = e.GetName();

        // 'salary' is indirectly accessed via property
        double s = e.Salary;
    }
}

메일관련

	private void SendMailing(string title)
	{
		MailMessage msgMail = new MailMessage();
		BoardMailingBiz objBoard = new BoardMailingBiz();
		DataSet dsMailing = objBoard.GetList(boardTable);

		string fromName, fromEmail;
		string toName, toEmail;
		string content = objBManager.BoardName + "에 [" + title + "] " + " 제목의 게시물이 등록되었습니다.";

		fromName = System.Configuration.ConfigurationSettings.AppSettings["AdminName"];
		fromEmail = System.Configuration.ConfigurationSettings.AppSettings["AdminMail"];
		msgMail.From = fromName + "<" + fromEmail + ">";

		StreamReader sr;
		String line;


		foreach(DataRow mailRow in dsMailing.Tables[0].Rows)
		{
			// IO & Mail Send
			toName = mailRow["UserName"].ToString();
			toEmail = mailRow["UserMail"].ToString();

			msgMail.To = toName + "<" + toEmail + ">";
			msgMail.Subject = mailRow["Subject"].ToString();
		
			sr = new StreamReader(Server.MapPath("mail.htm"), System.Text.Encoding.Default);
		
			if ((line = sr.ReadToEnd()) != null)
			{
				line = line.Replace("[Homepage]", System.Configuration.ConfigurationSettings.AppSettings["Homepage"]);
				line = line.Replace("[AdminMail]", System.Configuration.ConfigurationSettings.AppSettings["AdminMail"]);

				content = content.Replace("\n", "<br>");
				line = line.Replace("[Content]", content);
				line = line.Replace("[UserName]", toName);
				msgMail.Body = line;
			}

			sr.Close();

			msgMail.BodyFormat = MailFormat.Html;
			msgMail.BodyEncoding = System.Text.Encoding.GetEncoding("euc-kr");

			SmtpMail.SmtpServer = System.Configuration.ConfigurationSettings.AppSettings["SmtpServer"];
			SmtpMail.Send(msgMail);
		}
	}

ASP.NET에서 웹 서버에 파일 업로드 C# ASP.NET

ASP.NET에서 웹 서버에 파일 업로드 C# ASP.NET

2004/07/06 03:07

복사 http://blog.naver.com/tear230/100003833749

이 포스트를 보낸곳 ()

이 문서에서는 Visual C# .NET을 사용하여 웹 서버에 파일을 업로드하는 방법을 단계별로 설명합니다. 이 문서에서는 ASP.NET 파일(WebForm1.aspx) 및 해당 관련 코드 숨김 파일(WebForm1.aspx.cs)을 만들어서 Data라는 이름의 디렉터리에 파일을 업로드합니다.

ASP.NET 응용 프로그램 만들기

Microsoft Visual Studio .NET에서 새 응용 프로그램을 만들어서 웹 서버에 파일을 업로드하려면 다음과 같이 하십시오.

  1. Microsoft Visual Studio .NET을 시작합니다.

  2. 파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트를 누릅니다.

  3. 새 프로젝트 대화 상자의 프로젝트 형식에서 Visual C# 프로젝트를 누른 다음 템플릿에서 ASP.NET 웹 응용 프로그램을 누릅니다.

  4. 위치 상자에 URL을 입력하여 프로젝트를 만듭니다. 이 예에서 http://localhost/CSharpUpload 를 입력하면 CSharpUpload라는 기본 프로젝트 이름이 만들어집니다. WebForm1.aspx 파일이 Visual Studio .NET의 디자이너 보기에 로드됩니다.

Data 디렉터리 만들기

응용 프로그램을 만든 후에는 업로드한 파일을 저장할 Data 디렉터리를 만듭니다. 또한 이 디렉터리를 만든 후에 ASPNET 작업자 계정에 대해 쓰기 권한을 설정해야 합니다.

  1. Visual Studio .NET의 솔루션 탐색기 창에서 CSharpUpload를 마우스 오른쪽 단추로 누르고 추가를 누른 다음 새 폴더를 누릅니다. 기본적으로 NewFolder1이라는 이름의 폴더가 새로 만들어집니다.

  2. 폴더 이름을 Data로 바꾸려면 NewFolder1을 마우스 오른쪽 단추로 누르고 이름 바꾸기를 누른 다음 Data를 입력합니다.

  3. Windows 탐색기를 시작한 다음 2단계에서 만든 Data 파일 시스템 폴더를 찾습니다. 기본적으로 이 폴더는 아래 폴더에 있습니다.

    C:\Inetpub\wwwroot\CSharpUpload\Data

  4. 보안 설정을 변경하여 Data 디렉터리에 대한 쓰기 권한을 부여하려면 Data를 마우스 오른쪽 단추로 누른 다음 등록 정보를 누릅니다.

  5. Data 등록 정보 대화상자에서 보안 탭을 누른 다음 추가를 누릅니다.

  6. 사용자 또는 그룹을(를) 선택하십시오. 대화 상자에서 ASPNET계정을 누른 다음 추가를 누릅니다. 확인을 눌러 사용자 또는 그룹을(를) 선택하십시오. 대화 상자를 닫습니다.

  7. aspnet_wp account (computername\ASPNET) 계정을 누른 후 다음 사용권한에 대해 허용 확인란을 선택합니다.

    * 읽기 및 실행
    * 폴더 내용 보기
    * 읽기
    * 쓰기
    

    그 밖의 다른 허용 확인란과 거부 확인란은 모두 선택 취소합니다.

  8. 확인을 눌러 Data 등록 정보 대화 상자를 닫습니다. Data 디렉터리 사용 권한이 성공적으로 수정되어 사용자가 업로드한 파일이 저장됩니다.

WebForm1.aspx 페이지 수정

사용자가 파일을 업로드할 수 있도록 WebForm1.aspx 파일의 HTML 코드를 수정하려면 다음과 같이 하십시오.

  1. 앞에서 연 Visual Studio .NET의 인스턴스로 돌아옵니다. WebForm1.aspx가 디자이너 창에서 열립니다.

  2. WebForm1.aspx 페이지의 HTML 소스를 보려면 디자이너 창에서 WebForm1.aspx를 마우스 오른쪽 단추로 누른 다음 HTML 소스 보기를 누릅니다.

  3. 태그가 포함되어 있는 다음 HTML 코드를 찾습니다.
  4. 다음과 같이 태그에 enctype="multipart/form-data" 이름-값 특성을 추가합니다.

  5. 여는 태그 뒤에 다음 코드를 추가합니다. <INPUT type=file id=File1 name=File1 runat="server" />

  6. HTML 태그가 다음과 같은지 확인합니다.


WebForm1.aspx.cs 코드 숨김 파일에 업로드 코드 추가

업로드한 데이터를 받아들이도록 WebForm1.aspx.cs 숨김 코드 파일을 수정하려면 다음과 같이 하십시오.

  1. 보기 메뉴에서 디자인을 누릅니다.

  2. Upload를 두 번 누릅니다. Visual Studio가 WebForm1.aspx.cs 코드 숨김 파일을 열고 자동으로 다음과 같은 메서드 코드를 생성합니다.

    private void Submit1_ServerClick(object sender, System.EventArgs e) { }

  3. WebForm1.cs 파일의 클래스 수준에 다음과 같은 코드가 존재하는지 확인합니다.

    protected System.Web.UI.HtmlControls.HtmlInputFile File1; protected System.Web.UI.HtmlControls.HtmlInputButton Submit1;

    이 코드가 파일에 없으면 다음 줄 뒤에 코드를 추가합니다.

    public class WebForm1 : System.Web.UI.Page { }

  4. 다음 코드를 찾습니다.

      private void Submit1_ServerClick(object sender, System.EventArgs e)
      {
      }
  1. Enter 키를 눌러 빈 줄을 삽입한 후 다음 코드를 추가합니다.
      if( ( File1.PostedFile != null ) && ( File1.PostedFile.ContentLength > 0 ) )
      {
         string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);
         string SaveLocation = Server.MapPath("Data") + "\\" +  fn;
         try
         {
              File1.PostedFile.SaveAs(SaveLocation);
              Response.Write("The file has been uploaded.");
          }
         catch ( Exception ex )
         {
             Response.Write("Error: " + ex.Message);
          }
      }
      else
      {
          Response.Write("Please select a file to upload.");
      }
  이 코드는 파일이 업로드되었는지 가장 먼저 확인합니다. 파일을 선택하지 않은 경우에는 "Please select a file to upload" 메시지가 나타납니다. 올바른 파일을 업로드한 경우에는 System.IO 네임스페이스를 사용하면 파일 이름이 추출되고 대상이 SaveAs 경로에서 어셈블됩니다. 최종 대상을 알게 되면 File1.PostedFile.SaveAs 메서드를 사용하여 파일이 저장됩니다. 예외가 트래핑되면 예외 메시지가 화면에 표시됩니다.
  1. Submit1 서브루틴이 다음과 같이 나타나는지 확인합니다.
      private void Submit1_ServerClick(object sender, System.EventArgs e)
      {
           if( ( File1.PostedFile != null )
                         && ( File1.PostedFile.ContentLength > 0 ) )
           {
              string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);
              string SaveLocation = Server.MapPath("Data") + "\\" +  fn;
               try
                 {
                  File1.PostedFile.SaveAs(SaveLocation);
                  Response.Write("The file has been uploaded.");
                }
                catch ( Exception ex )
                {
                  Response.Write("Error: " + ex.Message);
                }
           }
           else
           {
               Response.Write("Please select a file to upload.");
           }
      } 

대용량 파일 업로드하기

ASP.NET Framework에서 HTTP Post 방식으로 파일을 업로드 할 수 있는 최대 크기는 기본적으로 4 MB입니다. 이는 악의적인 대용량 업로드로 인한 서버의 피해를 줄이고자 함입니다. 그 이상 크기의 파일을 업로드 하기 위해서는 machine.config (혹은, web.config) 파일에서 속성 값을 변경해주면 됩니다.

    <configuration>
<system.web>
      <httpRuntime 
	executionTimeout="90" 
	maxRequestLength="4096" 
	useFullyQualifiedRedirectUrl="false" 
	minFreeThreads="8" 
	minLocalRequestFreeThreads="4" 
	appRequestQueueLimit="100"/>
</system.web>
     </configuration>

여기서 maxRequestLength가 바로 업로드 할 수 있는 파일의 크기를 말합니다. maxRequestLength의 설정 값을 원하는 값으로 설정하면 됩니다.

Machine.config 파일은 C:\WINNT\Microsoft.NET\Framework\v1.0.3705\CONFIG 디렉터리에 있습니다.

[출처] ASP.NET에서 웹 서버에 파일 업로드|작성자 쎄이

[tip] 고급 SQL 생성옵션[Advanced SQL Generation Options] 비활성 요인

GrideView 및 기타에서 제목처럼 책크박스가 비활성화 되는 요인

  1. 테이블의 기본키가 없을 경우
  2. Configure Dta Source 창에서 기본키가 Select되지 않았을 경우

조치방법 : 서버탐색기((데이타베이스 탐색기)등을 이용하여 현재 작업중인테이블의 테이블 정의를 열고 기본키로 선정할 필드명에서 기본키를 설정해 준다.

Visual Studio .NET 2005에서 서버 탐색기로 MS SQL Server에 연결하기

출처 : http://jacking.springnote.com/pages/1923880

< Visual Studio .NET 2005에서 서버 탐색기로 MS SQL Server에 연결하기 >

MS SQL Server를 조작할 할 때에 보통Microsoft SQL Server Management Studio를 사용합니다.

하지만 Visual Studio( 이하 VS)를 매일 사용하는 프로그래머라면 VS에서 바로 DB에 연결하여 작업을 처리하는 것이 편할 수 있습니다.

VS에서 MS SQL Server에 연결하는 방법은 아래와 같습니다.

서버 탐색기 -> 연결 추가를 선택합니다.



아래 그림과 같이 데이터 소스를 선택합니다. 선택을 하면 아래의 데이터 공급자는 자동으로 선택됩니다.



서버 이름에 MS SQL Server의 네트웍 주소를 입력합니다.

그리고 서버에 로그온 하는 방식에 따라 아이디와 패스워드를 설정합니다.

위의 설정을 올바르게 했다면데이터베이스 이름 선택 또는 입력의 콤보박스를 클릭하면

기존에 만들어져 있는 데이터베이스를 선택할 수 있습니다.



것으로 연결 설정은 끝입니다. ^^

Table of contents 목차

  • The name 'Session' does not exist in the current context
  • Unix Time 구하기
  • 다양한 문자열포맷(통화, 날짜..)
  • DropDownList 에 다양한 데이타 바인딩 하기
  • 간단한 형 변환
  • ModalDialog 를 이용한 우편번호 검색
  • ASP.NET 유효성 검사 컨트롤(CustomValidator 를 사용하여 자바스크립트 직접제어)
  • App_Code 디렉토리(두가지 언어 사용)
  • 팝업에서 opener로 값 전달
  • DataBinder 에 관한 몇가지
  • SqlDataReader를 얻기 위한 절차
  • javascript(자바스크립트) 호출
  • post 방식으로 값 전달(PostBackUrl)
  • 페이지(Page)이벤트 & Page.IsPostBack 프로퍼티
  • [팁]DropDownList에서 onselectedindexchanged을 해도 이벤트가 실행이 안될때
  • DropDownList 에 Binding(바인딩) 하기
  • 범용 클래스 제작 방법
  • A potentially dangerous Request.Form value was detected from the client
  • 액세스 한정자(public,protected,Internal,private)
  • 메일관련
  • ASP.NET에서 웹 서버에 파일 업로드 C# ASP.NET
  • [tip] 고급 SQL 생성옵션[Advanced SQL Generation Options] 비활성 요인
  • Visual Studio .NET 2005에서 서버 탐색기로 MS SQL Server에 연결하기
  • 평점을 남겨주세요
    평점 : 2.5
    총 투표수 : 1