달력

062018  이전 다음

  •  
  •  
  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30


RegularExpressionValidator를 써서 구현 하면 된다. 정규식은 아래와 같다.

[^\s]{6,20} : 첫자가 스페이스가 들어가면 안되고 6자이상 20자 이하의 문자
.*[^A-Za-z0-9].* : A-Z, a-z, 0-9 이외의 문자가 하나 이상 들어갈 것

RegularExpressionValidator를 두개 만들어서 각각 걸어주었다.


// 실제 예
<asp:RegularExpressionValidator ID="RegularExpressionValidator3" runat="server"
ControlToValidate="EDT_NEW_PW"
ErrorMessage="Password consist of at least 6 characters, with no leading spaces."
Display="None" Text = "*"
ValidationExpression="[^\s]{6,20}">
</asp:RegularExpressionValidator>          
    
<asp:RegularExpressionValidator ID="RegularExpressionValidator2" runat="server"
ControlToValidate="EDT_NEW_PW"
ErrorMessage="Password must contain at least on non-alphanumeric character."
Display="None" Text = "*"
ValidationExpression=".*[^A-Za-z0-9].*">
</asp:RegularExpressionValidator>

// 2007. 8. 7 : 내용이 다 깨져보여서 살짝 편집~

Posted by 알이씨


요구사항 : 동적으로 구성한 Table Control의 상태를 유지
배경 : Database에서 특정 데이터를 가져와 가공한 뒤 사용자의 입맛에 맞게 테이블로 그 결과를 구성하였다. 하지만 다른 컨트롤을 조작하여 PostBack이 일어난다면 이전에 바운딩한 테이블 정보들이 모두 초기화 된다. 따라서 PostBack이 일어나도 이전 단계의 테이블 상태를 유지하는 것이 필요하였다.
조건 : 테이블 내용이 바뀔 필요가 없는 경우 PostBack이 일어난 뒤 DB 접근은 하지 않는다.

예제 코드

 Table Table_Work_History;

protected void Page_Load(object sender, EventArgs e)
{
    if(Page.IsPostBack){            
        if(Session["Table"] != null){
            Table_Work_History = (Table)Session["Table"]; // 저장된 테이블 상태 로딩
            PH.Controls.Add(Table_Work_History); // PH : Place Holder
        }           
    }
}

protected void rend_working()
{
    // Bounding Code

    Session["Table"] = Table_Work_History; // 테이블 상태를 세션에 저장
}

참고 :
 - Place Holder를 쓴이유는 테이블을 로딩한 후에 특정 위치에 넣어주기 위함이다.
 - Session을 이용하여 상태를 저장한 이유는 ViewState를 사용하면 Serializable 예외가 발생하기 때문이다.
        

Posted by 알이씨


목표 : TreeView의 각 노드에 체크박스를 두고 부모를 체크 하면 자식들은 모두 부모에 따름

웹 검색을 하다가 유용한 자료가 있어서 퍼왔습니다. 출처는 제일 아래에 있네요.
저는 이 소스를 다 쓴건 아니고 스크립트 부분만 썼습니다. PostBack 방식으로 했는데.
아무래도 좀 불편한거 같네요...
=====================================================================
체크 박스 이므로 여러개를 선택할수 있도록 체크 박스를 선택할때마다 이벤트가 발생하지는 않습니다.

그래서 약간의 편법을 이용한 자료를 올려 보겠습니다.


1. postback 처리

<%@ Page Language="C#" %>

<script runat="server">
protected void TreeView1_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e)
{
    foo(e.Node, e.Node.Checked);
}
private void foo(TreeNode e, bool check)
{
    e.Checked = check;
    foreach (TreeNode t in e.ChildNodes)
    {
        foo(t, check);
    }
}

</script>


<script>
function foo()
{
    var o = window.event.srcElement;
    if (o.tagName == "INPUT" && o.type == "checkbox"){
        __doPostBack("","");
    }
}
</script>

<html>

<head id="Head1" runat="server">

</head>

<body>

    <form id="form1" runat="server">

        <div>

            <asp:TreeView onclick="foo()" ID="TreeView1" runat="server" ExpandDepth="4" EnableClientScript="False"

                ShowCheckBoxes="All" OnTreeNodeCheckChanged="TreeView1_TreeNodeCheckChanged">

                <Nodes>

                    <asp:TreeNode ShowCheckBox="True" Value="a" Text="a">

                        <asp:TreeNode Value="aa" Text="aa">

                            <asp:TreeNode Text="aaa" Value="aaa">

                                <asp:TreeNode Text="aaaa" Value="aaaa"></asp:TreeNode>

                                <asp:TreeNode Text="abbb" Value="abbb"></asp:TreeNode>

                            </asp:TreeNode>

                            <asp:TreeNode Text="bbb" Value="bbb">

                                <asp:TreeNode Text="bbbb" Value="bbbb"></asp:TreeNode>

                            </asp:TreeNode>

                            <asp:TreeNode Text="ccc" Value="ccc"></asp:TreeNode>

                        </asp:TreeNode>

                    </asp:TreeNode>

                    <asp:TreeNode Text="bb" Value="bb">

                        <asp:TreeNode Text="bbb" Value="bbb"></asp:TreeNode>

                    </asp:TreeNode>

                </Nodes>

            </asp:TreeView>

        </div>

    </form>

</body>

</html>


2. 웹페이지상에서 스크립트로 처리 ..

<%@ Page Language="C#" %>

<html >

<head id="Head1" runat="server">

    <title>XML Tree View</title>

    <script language="javascript">

        //***each node in a TreeNode is a <table> and the level that a node exists on is

        //***decided by the number of columns in the table (that are use to push it out)

        //***CAVEATS

        //***(1)This only works with a static TreeView

        //***(2)This only works properly if EnableClientScript=true

        //***(3)If Microsoft(R) changes the HTML use to render the Nodes then this is obsolete

        //***(4)This does not account for all design considerations, but should be a good start

        function client_OnTreeNodeChecked() {      

            var obj = window.event.srcElement;

            var treeNodeFound = false;

            var checkedState;

           

            if (obj.tagName == "INPUT" && obj.type == "checkbox") {

                //easier to read

                var treeNode = obj;

               

                //record the checked state of the TreeNode

                checkedState = treeNode.checked;

               

                //work our way back to the parent <table> element      

                do {

                    obj = obj.parentElement;

                } while (obj.tagName != "TABLE")

           

                //keep track of the padding level for comparison with any children

                var parentTreeLevel = obj.rows[0].cells.length;

           

                //get all the TreeNodes inside the TreeView (the parent <div>)

                var tables = obj.parentElement.getElementsByTagName("TABLE");

               

                //total number of TreeNodes

                var numTables = tables.length


                if (numTables > 1) {

                    //cycle through all the TreeNodes

                    //until we find the TreeNode we checked

                    for (i=0; i < numTables; i++) {

                        if (tables[i] == obj) {

                            treeNodeFound = true;

                            i++;

                            if (i == numTables) {

                                //if we're on the last

                                //TreeNode then stop

                                return;

                            }

                        }

                       

                        //when found examine the TreeLevel of each of

                        //the preceding TreeNodes

                        if (treeNodeFound == true) {

                            var childTreeLevel = tables[i].rows[0].cells.length;

                           

                            //if the current node is under the parent

                            //the level will be deeper (greater)

                            if (childTreeLevel > parentTreeLevel) {

                           

                                //jump to the last cell... it contains the checkbox

                                var cell = tables[i].rows[0].cells[childTreeLevel - 1];

                               

                                //set the checkbox to match the checkedState

                                //of the TreeNode that was clicked

                                var inputs = cell.getElementsByTagName("INPUT");

                                inputs[0].checked = checkedState;

                            } else {

                                //if any of the preceding TreeNodes are not deeper stop

                                return;

                            }//end if

                        }//end if

                    }//end for

                }//end if

            }//end if

        }//end function

    </script>

</head>

<body>

    <form id="form1" runat="server">

    <asp:XmlDataSource ID="xmlSrc" runat="server" />

    <div>

    <asp:TreeView

        onclick="client_OnTreeNodeChecked();"

        ID="staticTree"

        runat="server"

        ExpandDepth="0"

        ShowCheckBoxes="All"

        EnableClientScript="true"

        ShowExpandCollapse="true"

        ShowLines="true"

        >

        <Nodes>

            <asp:TreeNode Text="Table of Contents"

            SelectAction="None">

                   

                <asp:TreeNode Text="Chapter One">

               

                    <asp:TreeNode Text="Section 1.0">

                   

                        <asp:TreeNode Text="Topic 1.0.1"/>

                        <asp:TreeNode Text="Topic 1.0.2"/>

                        <asp:TreeNode Text="Topic 1.0.3"/>

                   

                    </asp:TreeNode>

                   

                    <asp:TreeNode Text="Section 1.1">

                   

                        <asp:TreeNode Text="Topic 1.1.1"/>

                        <asp:TreeNode Text="Topic 1.1.2"/>

                        <asp:TreeNode Text="Topic 1.1.3"/>

                        <asp:TreeNode Text="Topic 1.1.4"/>

                   

                    </asp:TreeNode>

               

                </asp:TreeNode>

               

                <asp:TreeNode Text="Chapter Two">

               

                    <asp:TreeNode Text="Section 2.0">

                   

                        <asp:TreeNode Text="Topic 2.0.1"/>

                        <asp:TreeNode Text="Topic 2.0.2"/>

                   

                    </asp:TreeNode>

               

                </asp:TreeNode>

               

            </asp:TreeNode>

            <asp:TreeNode Text="Appendix A" />

            <asp:TreeNode Text="Appendix B" />

            <asp:TreeNode Text="Appendix C" />

        </Nodes>

    </asp:TreeView>

    </div>

    </form>

</body>

</html>


필요한걸 사용하시면 될듯하네요 ..


=========================

Visual C# MVP Freecoder

http://freecoder.pe.kr

=========================

Posted by 알이씨


딱 아래와 같은 내용을 찾았었다.

출처 : 데브피아
주소 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=8&MAEULNo=5&no=81&ref=63

//////////////////////////////////////////////////////////////////////////////////
ASP.NET 중에서 큰 부분은 아니지만, 가장 신경쓰이는 부분중의 하나가 client-script과의 연동문제입니다. 그중에서 제일 신경 쓰였던 부분이 메세지 박스에 대한 처리였습니다.
웹에서 저장,삭제 버튼이 클릭된다면, 바로 저장되는 것이 아니라, 사용자에게 메세지박스를 띄어서확인을 해야하는데, 지금부터 그 부분을 다루려고 합니다...
코딩부분은 간단합니다. 저의 경우에는 Btn_Delete라는 "삭제" 버튼을 생성했습니다.

this.Btn_Delete.Attributes.Add("onclick","return confirm("삭제하시겠습니까?");");

코드에서는 버튼의 attribute를 추가시킨 것을 볼 수 있습니다. 첫번째 인수는 onclick이라는 이벤트이고, 두번째 인수는 javascript의 confirm함수입니다.  아~ 그냥 클릭이라는 이벤트에 confirm함수를 연결 시켰나보다... 라고 넘어갈 수도 있지만,  잠시 더 생각해 보면,

<asp:Button id="Btn_Delete" runat="server" onClick="Btn_Delete_Click" />

이렇게 되어있다면, 어떻게 해석이 될까요? 이벤트가 중복선언 된 것일까요?
차이점은 위의것은 client-script이고, Btn_Delete_Click은 server-script임다....
웹 컨트롤이 서버에서 해석되면서, 웹 컨트롤과 서버 스크립은 각각 html,client-script으로 해석됩니다.

그렇다면, 먼저 쓰인(confirm(...)) 스크립과 해석되어진 스크립과의 차이점은 무엇일까요?
먼저 쓰인 것은 사용시 서버와의 라운드 트립을 발생시키지 않습니다. 후자의 경우 Btn_Delete_Click이라는 스크립은 원래 서버스크립이 분석되어 Client-Script이 된 것이기 때문에 반드시 서버와의 round-trip이 발생합니다. 즉, 해석된 코드를 소스보기에서 보면, submit();하는 부분이 항상 있습니다.  

이벤트 발생순서는 확인하는 창이 먼저 뜨고, Yes를 눌렀을 경우에 Btn_Delete_Click 함수가 실행되어 실제 데이터가 삭제됩니다. 사용자가 취소를 누른 경우에는 false가 리턴되어 Server-Script(Btn_Delete_Click)은 실행되지 않습니다.
Posted by 알이씨


요구사항 : 사용자가 웹에서 본 데이터를 특정 포멧에 맞추어 엑셀 파일로 저장
조건 : 사용자가 보는 데이터 포멧은 일정하다. 즉 데이터 개수만 다를 뿐 그 항목은 같다.
준비사항 : 엑셀 .COM 컴퍼넌트를 가져와야 함(즉 서버측에 엑셀이 일단 설치가 되어 있어야 함)

Visual Studio 2005 메뉴에서 다음 과정을 거침
Website - 참조 추가 - COM 탭으로 이동
Microsoft Excel x.x Object Library 선택

특정 파일을 읽어와서 수정 후 다른 이름으로 저장하는 소스
==============================================================================
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Excel = Microsoft.Office.Interop.Excel;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        
        Excel.Application excelApp = new Excel.Application();
        excelApp.Visible = false;
        Excel.Workbook excelWorkbook = excelApp.Workbooks.Open("e:\\test.xls", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing); // test.xls 파일을 열어서

        Excel.Sheets excelSheets = excelWorkbook.Worksheets;
        string currentSheet = "Sheet1";
        Excel.Worksheet excelWorksheet = (Excel.Worksheet)excelSheets.get_Item(currentSheet);
        Excel.Range range;
        range = excelWorksheet.get_Range("A1", Type.Missing); // A1 위치에

        range.set_Value(Type.Missing, "요거이 테스트");  // 데이터를 삽입

        excelWorkbook.SaveAs("e:\\copy_test.xls", Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlExclusive,
Type.Missing, Type.Missing , Type.Missing, Type.Missing, Type.Missing); // 다른 이름으로 저장
        excelApp.Quit(); // 프로그램 종료
    }
}


Posted by 알이씨



목표

특정 이미지를 클릭하면 다른 이미지로 변경되고 다시 클릭하면 원래 이미지로 돌아오는 토글 형식의 이벤트를 구현, 단 해당 컨트롤은 서버쪽에서도 접근 가능해야 함


준비
이미지 컨트롤은 asp .net의 이미지 컨트롤을 사용하지 않고 html 컨트롤을 사용한다. 적당한 위치에 이미니 컨트롤을 추가

<span style="cursor:hand" onclick="return Test_Change_Img('Test_Img');">       
        <img src = "img/small-sphere-green.bmp" runat="server" alt="" id= "Test_Img" name = "Test_Img" style="border-width: 0" enableviewstate="false" /></span>

초기 이미지는 img 폴더의 small-sphere-green.bmp 로 설정하였다.


구현

함수를 호출하는 곳에서 해당 이미지의 이름을 함께 넘겨준다. 함수 구현부에서는 컨트롤 이름을 통해 이미지의 url을 알아내고 해당 url을 비교하여 토글링에 이용한다.

주의 : 이미지 src에는 full url이 들어가 있다 따라서 이미지 파일 이름만 얻어오기 위해 몇가지 string 관련 함수를 이용하였다.

function Test_Change_Img(){   
    var str = document[Test_Change_Img.arguments[0]].src;   
    var str_index = str.[각주:1]lastIndexOf("/");
    var img_src_str = str.[각주:2]slice(str_index+1, str.length);    
   
    if(img_src_str == "small-sphere-red.bmp"){
        document[Test_Change_Img.arguments[0]].src = "img/small-sphere-green.bmp";
    }else{
        document[Test_Change_Img.arguments[0]].src = "img/small-sphere-red.bmp";
    }   
}


비하인드 코드(*.cs)에서는 다음과 같이 이미지 컨트롤에 접근할 수 있다.

Test_Img.Src = "img/small-sphere-red.bmp";
  1. 매개변수 스트링이 나타나는 마지막 위치 인덱스 반환 [본문으로]
  2. 문자열의 특정 위치부터 특정 위치까지를 반환 [본문으로]
Posted by 알이씨


본 내용은 ASP .NET 2.0에 관련된 내용입니다.

1. 비컴파일 페이지 만들기
컴파일 할 필요가 없는 페이지에는 다음과 같은 코드를 삽입하여 컴파일러가 해당 페이지를 컴파일 하지 않게 하는 것이 좋다.

- 페이지 단위 적용
<%@ Page CompilationMode="Never" %>

- 어플리케이션 단위 적용
<configuration>
    <system.web>
        <pages compilationMode="Never" />
    </system.web>
</configuration>



2. 뷰 상태 사용 자제
PostBack을 하여도 상태 관리를 할 필요가 없는 서버 컨트롤들의 뷰 상태를 사용하지 않으면 네트워크 전송량을 줄여 성능 향상을 이룰 수 있다.

- 페이지 단위 적용
<%@ Page EnableViewState="false" %>

- 컨트롤 단위 적용
컨트롤 속성에서 EnableViewState 속성을 False로 변경


3. 서버 컨트롤 사용 자제
서버 컨트롤을 사용하지 않고 기본적인 HTML을 이용하여 구현할 수 있다면 서버측의 자원을 아낄 수가 있다.

예> 하이퍼링크

<a href  = "http://suemirr.airpoint.co.kr"> 알이의 블로그 </a>

<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="http://suemirr.airpoint.co.kr> 알이의 블로그 </asp:HyperLink>

4. DB를 접근할 때는 상황에 맞게 DataSet과 DataReader를 사용한다.

- DataSet이 더 효율적인 경우
  . 여러 개의 데이터 소스로부터 가져온 데이터 테이블들을 다시 연관지어 재검색하는 경우
  . XML 웹 서비스를 사용하는 경우. DataSet 개체는 원격 클라이언트로 전달이 가능
  . 데이터 캐시에 데이터 소스로부터 가져온 데이터를 저장하여 성능 향상을 도모할 경우
  . 대량의 행 단위 처리가 필요한 경우(한 행을 처리 하는데 걸리는 시간때문에 계속 연결되어 있다면 성능이 저하됨)

- DataReader
  . 데이터 캐시에 저장할 필요가 없는 경우
  . 데이터 소스로부터 가져온 결과 집합이 너무 커서 메모리에 저장할 수 없는 경우,
  . 읽기전용인 상태로 빠르게 데이터에 접근해야 할 경우
Posted by 알이씨



목표

 페이지 내에서 SQL SERVER의 특정 테이블의 내용이 변경될 때만 해당 테이블을 표현하는 컨트롤을 다시 파싱하여 읽고 싶다. 이외의 다른 컨트롤들은 테이블 변경과 상관없이 다시 파싱하게 한다.

준비

  1. 사용하는 데이터베이스가 캐싱이 가능하게 만들어 줘야한다.
  2. web.config에 캐싱 관련 코드를 입력해야한다.

1. 데이터베이스가 캐싱이 가능하게 등록

Visual Studio 2005 Command Prompt에서 다음과 같이 입력

==== DB를 캐싱 가능하게 등록 ====

aspnet_regsql -S "." -U "UserID" -P "UserPassword" -d "DBName" -ed

>> DB에 AspNet_SqlCacheTablesForChangeNotification 테이블이 생성됨

==== 테이블을 캐싱 가능하게 등록 ====

aspnet_regsql -S "." -U "UserID" -P "UserPassword" -d "DBName" -et -t "TableName"

>> AspNet_SqlCacheTablesForChangeNotification 테이블에 TableName 테이블 관련 정보가 추가됨

2. web.config에 캐싱 관련 코드 입력

<system.web>
    <caching>
       <sqlCacheDependency enabled="true" pollTime="1000">
        <databases>
         <add name="DBName" connectionStringName="ConnectionStringName" />
        </databases>
       </sqlCacheDependency>
    </caching>
</system.web>

시작

WebUserControl 생성

1. Add New Item -> Web User Control 추가
2. 생성된 ascx 소스에서 상단에 다음 코드 추가

<%@ OutputCache Duration="999999" SqlDependency="DBName:TableName" VaryByParam="none" %>


WebPage에 WebUserControl 삽입

1. aspx 소스 상단에 다음 코드 추가

<%@ Register Src="FileName.ascx" TagName="TagName" TagPrefix="uc1" %>

2. 적당한 위치에 WebUserControl 삽입

<uc1:TagName ID="UserControlID" runat="server" />


테스트

1. TableName에 INSERT, DELETE, UPDATE와 같은 쿼리가 수행이 되면
AspNet_SqlCacheTablesForChangeNotification 테이블에 changID 필드의 값이 변경됨

2. WebUserControl 페이지에 라벨을 하나 추가하고 Page_Load에 다음 코드 삽입

   [각주:1]Label1.Text = System.DateTime.Now.ToString();


3. 브라우저에서 aspx 페이지를 읽으면 현재 시간이 찍힌다. 하지만 F5든 CTRL+F5든 눌러서 새로고침을 해도 그 시간은 바뀌지 않는다. 즉 새로 파싱을 하는 것이 아니라 캐싱된 페이지를 그대로 읽는 것이다.

4. 캐싱으로 연결된 테이블의 내용을 변경하고 F5를 눌러 새로고침을 하면 시간이 업데이트 된다.

  1. 만약 페이지가 새로 파싱이 되면 시간이 변경될 것이다. [본문으로]
Posted by 알이씨


주의 : FileUpload 컴퍼넌트 추가 후 사용
참고 : 같은 이름의 파일이 존재할 경우 "filename_x.ext" 형식으로 파일을 업로드 함

========= 파일 업로드 ==========
        if (FileUpload1.HasFile)
        {
            string upDir = "E:\\Study\\Web\\EmsClient\\Upload\\";
            DirectoryInfo di = new DirectoryInfo(upDir);
            if (!di.Exists)
                di.Create();

            string fName = FileUpload1.FileName;
            string fFullName = upDir + fName;

            FileInfo fInfo = new FileInfo(fFullName);
            if (fInfo.Exists)
            {

                int fIndex = 0;
                string fExtension = fInfo.Extension;
                string fRealName = fName.Replace(fExtension, "");

                string newFileName = "";
                do
                {
                    fIndex++;
                    newFileName = fRealName + "_" + fIndex.ToString() + fExtension;
                    fInfo = new FileInfo(upDir + newFileName);
                } while (fInfo.Exists);

                fFullName = upDir + newFileName;
            }

            FileUpload1.PostedFile.SaveAs(fFullName);
            Label1.Text = "업로드 된 파일 : " + fFullName;
        }
        else
        {
            Label1.Text = "업로드 된 파일이 존재하지 않습니다.";
        }

Posted by 알이씨


===== 파일 이름 변경 및 삭제 ====

string upDir = "E:\\Upload\\";
string fileName = upDir + ListBox1.SelectedItem.Text;
string newName = upDir + TXT_RENAME.Text;
FileInfo fi = new FileInfo(fileName);
fi.MoveTo(newName); // 이름 변경
fi.Delete(); // 파일 삭제

===== 파일 검색 =====
string upDir = "E:\\Upload\\";
DirectoryInfo di = new DirectoryInfo(upDir);       

FileInfo[] fiArr = di.GetFiles();

foreach (FileInfo fri in fiArr)
    ListBox1.Items.Add(fri.Name);  // 리스트 박스에 이름들 한번 뿌려봤다.

Posted by 알이씨

티스토리 툴바