TextBox ID : txtSearch
Button ID    : btnSearch

txtSearch.Attributes.Add("onkeypress", "if (event.keyCode == 13) {" + Page.GetPostBackEventReference(btnSearch) + "; return false;}");

이렇게 하면
TextBox에 포커스가 가 있을때 엔터를 누르면 해당 버튼의 클릭 이벤트가 발생한다.


참고사이트 KOXO
by 피요히코~ 2009. 2. 26. 16:10

 

1 27일 개최된 Microsoft TechDays Japan 2009 첫날 세션 “Silverlight의 미래는 오노 모토히사가 나와 Silverlight 2의 상세한 기능과 앞으로 추가될 기능들에 대해서 소개하였다.

 

Silverlight는 지금 어떻게 되어 있는건가?

Silverlight 2 2008 10월에 정식 릴리즈되었다. .NET 프레임웍의 부분집합형태로서 .NET 언어로 개발할 수 있게 된 것 외에 Silverlight Tools for Visual Studio 2008 SP1에 의해 VS상에서 비주얼한 개발도 되고 여러 컨트롤 컴포넌트도 표준으로 준비되어 기존 개발 노하우를 살려 효율적으로 개발할 수 있게 되어 실무에서 이용할 수 있게 되었다고 말하였다. 실제 북경 올림픽이나 오바마 대통령 취임식 중계등의 이슈도 나오기 시작하였다.

차기 버전인 Silverlight 3에서는 H.264/ACC코덱, 3D렌러딩, GPU 이용 지원이 예정되어 있다. 그 외, 리치한 데이터바인딩 기능, 컨트롤 확대, Linux대응(Monolight)등 한층 더 표현력 향상이 기대된다. 최근 Cloud 컴퓨팅이 주목받으면서 이에 알맞은 클라이언트쪽 성능향샹도 기대된다. 여기서 동향을 파악하고 싶은 RIA기술의 하나라고 말할 수 있을 것이다.

 

Silverlight 컨트롤

Silverlight 2에서는 버튼, 하이퍼링크, 체크박스, 데이터그리드 등 대표적인 응용프로그램에 이용되는 컴포넌트를 표준으로 제공하고 있다.

또한, Silverlight 3에 포함될 현재 개발중인 컨트롤은 Silverlight Toolkit으로 CodePlex에 공개되고 있다. 소스코드 이외, 문서나 샘플, 유닛테스트도 공개되어 있기 때문에, 실제로 다운로드하여 테스트해보는 것이 좋다. 정기적으로 릴리즈와 고객의 피드백을 통해 안정적인 상황에서는 자주 이용되는 것은 코어런타임으로서 포함되고 그 이외는 SDK Tools로서 릴리즈된다고 한다.

 

 fig03.jpg

소스코드 주석에 있는 <QualityBand> Stable이면 안정화버전, “Mature”라면 리테일버전

 fig04.jpg


일본어 지원하는 샘플페이지(한글페이지는 언제쯤 ㅠ_)

 

Silverlight Toolkit의 각 컨트롤

새로운 컨트롤은 WPF로부터 이식한 컨트롤과 Silverlight 독자적인 컨트롤 2가지로 나누어진다. 전자는 컴포넌트 레이아웃을 처리하는 DockPanel이나 컨텐츠를 전개하고 포함시키는 Expander, 네스트된 계층구조를 표시하는 TreeView등이 있다.

fig05.jpg 


DockPanel HTML <div>태그에 의한 레이아웃과 같은 배치가 가능


fig06.jpg
Expander,
아이콘을 클릭하면 4개 방향으로 전개할 수 있는 컨테이너

 

후자의 경우 입력내용을 보완하는 텍스트박스 AutoComplete나 다양한 그래프 표시가 가능한 Charting등이 있다. 컨트롤 개발팀은 WPF Silverlight를 같이 하고 있어, 이런 컨트롤의 WPF대응판도 준비중이라고 한다.

 fig07.jpg


AutoComplete, 입력보완 텍스트박스


fig08.jpg
Charting,
공통 데이터포멧으로 여러형태의 표를 표시

 

또한, 응용프로그램 외형 통일이나 변경이 쉽게 하는 스타일도 지원되어 현재 9가지 테마가 제공된다. XAML상에서 지정하는 것만으로 간단하게 테마를 적용할 수 있다.

 fig09.jpg


Theming, 스타일 통일이나 변경이 쉽게

 

Silverlight의 미래 및 모바일 대응

Silverlight 방향성으로서 많은 사용자들에게 사용되는 Reach라는 사용자 경혐을 제공하는 Rich 2가지 축이 되는 모바일 대응에 대한 내용도 소개되었다. Silverlight 2를 기반으로 Silverlight 2 for mobile CTP가 현재 2009년 제1/4분기에 나올 예정이고 2009년내에 릴리즈될 예정이라고 한다. 당초 탑재될 예정인 기기로는 Windows Mobile Nokia S60이라고 한다.

실제 에뮬레이터를 이용한 개발중인 데모를 봤지만, 에뮬레이터에서는 응용프로그램 시작에 시간이 다소 걸렸지만, 3D처리나 동영상 재생, 웹서비스 이용등은 PC의 브라우저에서 실행하는 것과 차이가 없었다. 실제 실용적인 레벨까지 개량된 것 같다.

추가로 개발언어 사용구분에 대해서는 가벼운 기능으로 실행 시간을 짧게 하고 싶은 경우 자바스크립트로 처리하고 고급기능을 이용하고 싶은 경우 실행시간이 좀 걸리지만, .NET 프레임웍 기반으로 구현하면 좋다고 한다.

 fig10.jpg


에물레이터와 PC브라우저의 3D이미지 표시



출처: Codezine

익스프레션 웹 사용자카페: http://cafe.naver.com/expressionweb

by 피요히코~ 2009. 2. 26. 11:51
by 피요히코~ 2009. 2. 26. 01:09

SqlDataReader vs SqlDataAdapter 

              연결 vs 비연결

 

 DB 종속적(sqlData~, oleData~)  vs DB 독립적(Dataset 앞에   sql 어쩌고가 없으니까..)

 

 SqlDataReader (매번 db 왓다갓다 해야되므로 속도가 저하된다.)

 

 질의(select *from tblAddress) 날릴때마다 db 왓다갓다 하면서 결과를 보여주는것.

 

 SqlDataAdapter (db 매번접근해야되는 횟수가 많으면 속도가 훨씬 빠르다. db 매번 접속하지 않으니까..더많이쓰임)

 

 fill 메서드가 호출되면 그이후에는 db 접속하지않는다. DataSet "select *from tblAddress" 결과가 복사되어있다.

 

이후부터는 DataSet 에서 가져와서 사용하는것이다.

 

 

 

string query = "select *from tblAddress";

// 1. 데이터 어댑터 생성

SqlDataAdapter adapter = new SqlDataAdapter(query, Properties.Resources.conStr);

            

// 2. 데이터 집합 생성 - 복사본

DataSet ds = new DataSet();

 

// 3. 데이터 채우기

adapter.Fill(ds, "tblAddress");

 

Console.WriteLine(ds.Tables["tblAddress"].Rows.Count);

 

// 4. 데이터 확인

DataTable dt = ds.Tables["tblAddress"];

for (int i = 0; i < dt.Rows.Count; i++)

 {

Console.WriteLine("{0}\t{1}\t{2}\t{3}", dt.Rows[i]["id"].ToString(),dt.Rows[i]["name"].ToString(),

dt.Rows[i]["email"].ToString(), dt.Rows[i]["age"].ToString());

 }

 


 

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

 

 

//질의가 두개 일때의 처리방법

SqlDataAdapter adapter = new SqlDataAdapter("select *from tblTest1; select *from tblTest2;", con);

 

DataSet ds = new DataSet();

adapter.Fill(ds); // 질의가 두개일때는 임시테이블명 못준다.

            

 // 질의가 두개 일때는 아래와같이 테이블 이름을 준다...

ds.Tables[0].TableName = "tblTest1";

ds.Tables[1].TableName = "tblTest2";

 

Console.WriteLine(ds.Tables.Count);

 

for (int i = 0; i < ds.Tables.Count; i++)

 {

for (int j = 0; j < ds.Tables[i].Rows.Count; j++)

{

Console.WriteLine("{0}\t{1}",ds.Tables[i].Rows[j]["seq"].ToString(), ds.Tables[i].Rows[j]["memo"].ToString());

}

}

 

// 테이블 1 추가

SqlDataAdapter adapter2 = new SqlDataAdapter("select *from tblAddress", con);

//DataSet ds2 = new DataSet();

 adapter2.Fill(ds, "tblAddress");

 

 Console.WriteLine(ds.Tables.Count);

 

for (int i = 0; i < ds.Tables.Count; i++)

{

Console.WriteLine(ds.Tables[i].TableName);

 }


 

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

 

// 연결지향

// 리스트를 2 출력!

// 연결데이터를 안쓰는 가장큰이유.. 동일한데이터를 2번출력 없으므로..

 // 따라서 연결지향쓰는 경우는 한번만 훓어서 출력하고 싶을경우에 쓴다.

SqlConnection con = new SqlConnection(Properties.Resources.conStr);

 

SqlCommand cmd = new SqlCommand("select *from tblAddress", con);

con.Open();

SqlDataReader reader = cmd.ExecuteReader();

            

// EOF 커서는 전진커서..뒤로 역탐색은 불가능하다.

while (reader.Read())

{

Console.WriteLine((int)reader["age"]+1);

// ★★ reader.GetInt32() : 캐스팅되서 나오는것. , 인덱스로만 접근가능하다.

Console.WriteLine(reader.GetInt32(3) + 1); 

Console.WriteLine("{0}\t{1}", reader["id"].ToString(), reader["age"].ToString());

}

 

 reader.Close();

reader = cmd.ExecuteReader();

 

while (reader.Read())

 {

 Console.WriteLine("{0}\t{1}", reader["id"].ToString(), reader["age"].ToString());

}

 con.Close(); // 읽은후에는 연결종료

 reader.Close(); // reader 종료

 

// 비연결

 // 2번출력해주는게 쉽다.빠르다. (DatasSet 들어있으니까..)

SqlDataAdapter adapter = new SqlDataAdapter("select *from tblAddress", con);

DataSet ds = new DataSet();

adapter.Fill(ds, "tblAddress");

 

// 2 출력

for (int i = 0; i < ds.Tables[0].Rows.Count; i++)

{

Console.WriteLine("{0}\t{1}", ds.Tables[0].Rows[i]["id"].ToString(), ds.Tables[0].Rows[i]["age"].ToString());

}

 Console.WriteLine();

 for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 

 {

Console.WriteLine("{0}\t{1}", ds.Tables[0].Rows[i]["id"].ToString(), ds.Tables[0].Rows[i]["age"].ToString());

}


by 피요히코~ 2009. 2. 25. 13:17

ADO.NET


ExecuteNonQuery

ExecuteReader : SqlDataReader 반환.

 - reader 원본테이블을 가져오는게 아니라 select 결과값을 가져오는 것이다.

 - reader.FieldCount = 레코드의 전체 갯수 (배열의 count  같음)

 - 쿼리가 두개있을때 읽어 오는방법

 

cmd.CommandText = "select id, name, email from tblAddress; select count(*) from tblAddress";

while (reader.Read())

{

for (int i = 0; i < reader.FieldCount; i++)

{

Console.Write("{0}\t", reader[i]);

}

Console.WriteLine();

}

 

// 두번쨰 결과셋에 접근

if (reader.NextResult())

{

// count(*)

reader.Read();

Console.WriteLine(" 학생수(2번째select 사용): {0} ", reader[0]);

}

 reader.Close();


by 피요히코~ 2009. 2. 25. 13:16

XMLDocument 이용한 검색

 

string path = "booklist.xml";

XmlDocument doc = new XmlDocument();

doc.Load(path);

string xPath = "//book/title[../@kind='소설']";

// SelectNodes 메서드는 검색조건에 맞는 개체를 XmlNodeList 반환하고

// SelectSingleNode 메서드는 검색조건에 맞는 단한개의 XmlNode 만을 반환(ID속성일 경우 쓰임)

           

XmlNodeList nodeList = doc.SelectNodes(xPath);

for (int i = 0; i < nodeList.Count; i++)

{

string title = nodeList[i].InnerText;

Console.WriteLine(title);

}


 

XPathDocument 이용한 검색

 // [1]. XPathDocument 생성

XPathDocument xdoc = new XPathDocument("booklist.xml");

// [2]. XPathNavigator 생성 -> XML 데이터를 탐색하고 편집하기 위한 커서모델을 제공한다.

XPathNavigator xPathNavi= xdoc.CreateNavigator();

// [3]. XPathNodeIterator 생성 -> 반복기 역활

XPathNodeIterator xPathIterator = xPathNavi.Select("//booklist/book/title[../@kind='컴퓨터']");

// [4]. kind='컴퓨터' 없을 까지 돈다.

while (xPathIterator.MoveNext())

{

     XPathNavigator navigatorTitle = xPathIterator.Current;

     Console.WriteLine(navigatorTitle.Value);

}  



by 피요히코~ 2009. 2. 25. 13:15

XML 에서 속성 가져오는 방법..

            string path = "booklist.xml";
            XmlDocument doc = new XmlDocument();
            doc.Load(path);

            XmlElement booklist=doc.DocumentElement;
            XmlElement FirstBook = (XmlElement)booklist.FirstChild;

            // 1. XmlAttributeCollection 를 사용해서 속성 가져오기 
            XmlAttributeCollection attributes = FirstBook.Attributes;
            for (int i = 0; i < attributes.Count; i++)
            {
                XmlAttribute attribute = (XmlAttribute)attributes[i];
                Console.WriteLine(attribute.Name + ":" + attribute.Value);
            }

            // 2. GetAttributd() 메서드를 이용해서 속성 가져오기
            string id = FirstBook.GetAttribute("id");
            Console.WriteLine("id:"+id);
            string kind = FirstBook.GetAttribute("kind");
            Console.WriteLine("kind:"+kind);
        }



 

XML 에서 모든엘리먼트 가져오기
 
           string path = "booklist.xml";
            XmlDocument doc = new XmlDocument();
            doc.Load(path);

            XmlElement booklist = doc.DocumentElement;

          
            //// GetElementsByTagName() 으로 엘리먼트 가져오기
            XmlNodeList titleNodeList = doc.GetElementsByTagName("price");
            for (int i = 0; i < titleNodeList.Count; i++)
            {
                XmlNode titleNode = titleNodeList[i];
                XmlNodeList childNodeList = titleNode.ChildNodes;
                XmlNode textNode = childNodeList[0];
                string value = textNode.Value;
                Console.WriteLine(value);
            }



by 피요히코~ 2009. 2. 25. 13:14
string filePath = "booklist.xml";

XmlDocument doc = new XmlDocument();

doc.Load(filePath);

// 잘짜인 xml 이면은 반드시 한개의 엘리먼트가 있기때문에 XmlDocument 개체의 속성인 DocumentElement 바로 얻을 있다.

 

XmlElement booklist = doc.DocumentElement; 

 

// 첫번쨰 자식엘리먼트의 노드들의 수를 가져온다.

XmlNodeList childs = FirstBook.ChildNodes;

 

// 첫번쨰 자식엘리먼트의 카운트수 만큼 노드의 이름 내용을 보여준다.            

for (int i = 0; i < childs.Count; i++)

{

       XmlElement eChild = (XmlElement)childs[i];

      Console.WriteLine(eChild.Name + ":" + eChild.InnerText);

 }


by 피요히코~ 2009. 2. 25. 13:14

<StackPanel>

<Canvas Width="350" Height="200">

<Rectangle Canvas.Left="150" Canvas.Top="50" Stroke="Black" StrokeThickness="5"

  Fill="Azure" Width="50" Height="150">

<Rectangle.RenderTransform>

<TransformGroup>

<!--변형축이 좌측하단-->

<RotateTransform x:Name="xform1" Angle="-90" CenterX="0" CenterY="150"/>

<!--변형축이 우측하단-->

<RotateTransform x:Name="xform2" CenterX="50" CenterY="150"/>

</TransformGroup>

</Rectangle.RenderTransform>

</Rectangle>

</Canvas>

<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">

<Button Name="btnBegin" Content="Begin" Margin="12"/>

<Button Name="btnPause" Content="Pause" Margin="12"/>

<Button Name="btnResume" Content="Resume" Margin="12"/>

<Button Name="btnStop" Content="Stop" Margin="12"/>

<Button Name="btnEnd" Content="Skip to End" Margin="12"/>

<Button Name="btnCenter" Content="Skip to Center" Margin="12"/>

</StackPanel>

<StackPanel.Triggers>

<!--외부에서도 Trigger가능-->

<EventTrigger SourceName="btnBegin" RoutedEvent="Button.Click">

<BeginStoryboard Name="story1">

<Storyboard>

<DoubleAnimation

Storyboard.TargetName="xform1"

Storyboard.TargetProperty="Angle"

From="-90" To="0"

Duration="0:0:5"/>

 

<DoubleAnimation

Storyboard.TargetName="xform2"

Storyboard.TargetProperty="Angle"

From="0" To="90"

Duration="0:0:5"/>

</Storyboard>

</BeginStoryboard>

</EventTrigger>

 

<!--storyBoard 대한 제어 가능-->

<EventTrigger SourceName="btnPause" RoutedEvent="Button.Click">

<!--정지-->

<PauseStoryboard BeginStoryboardName="story1"/>

</EventTrigger>

 

<EventTrigger SourceName="btnResume" RoutedEvent="Button.Click">

<ResumeStoryboard BeginStoryboardName="story1"/>

</EventTrigger>

 

<EventTrigger SourceName="btnStop" RoutedEvent="Button.Click">

<!--초기화-->

<StopStoryboard BeginStoryboardName="story1"/>

</EventTrigger>

 

<EventTrigger SourceName="btnEnd" RoutedEvent="Button.Click">

<!--진행단계의 마지막으로-->

<SkipStoryboardToFill BeginStoryboardName="story1"/>

</EventTrigger>

 

<EventTrigger SourceName="btnCenter" RoutedEvent="Button.Click">

<!--진행단계의 특정시간으로-->

<SeekStoryboard BeginStoryboardName="story1" Offset="0:0:2.5"/>

</EventTrigger>

</StackPanel.Triggers>

</StackPanel>



 


초기화면

Begin >> Pause

Skip to Center

by 피요히코~ 2009. 2. 25. 13:11

<Window.Resources>

<Style TargetType="{x:Type Button}">

<Setter Property="Width" Value="30"/>

<Setter Property="Height" Value="50"/>

<Setter Property="Background" Value="White"/>

<Setter Property="LayoutTransform">

<Setter.Value>

<ScaleTransform CenterX="15" CenterY="25"/>

                           <!--변화시길 기준좌표값-->

</Setter.Value>

</Setter>

 

<Style.Triggers>

<EventTrigger RoutedEvent="Button.MouseEnter">

<BeginStoryboard HandoffBehavior="Compose">

<!--Compose : 개체의 크기가 변할때 다른 개체를 가리지 않도록-->

<Storyboard>

<DoubleAnimation

Storyboard.TargetProperty="LayoutTransform.ScaleX"

Duration="0:0:.5"

From="1" To="2"

FillBehavior="Stop"

AutoReverse="True"/>

 

<DoubleAnimation

Storyboard.TargetProperty="LayoutTransform.ScaleY"

Duration="0:0:.5"

From="1" To="2"

FillBehavior="Stop"

AutoReverse="True"/>

</Storyboard>

</BeginStoryboard>

</EventTrigger>

 

<EventTrigger RoutedEvent="Button.Click">

<BeginStoryboard>

<Storyboard>

<ColorAnimation

Storyboard.TargetProperty="Background.Color"

Duration="0:0:1"

From="White" To="Orange"

FillBehavior="Stop"

AutoReverse="True"/>

</Storyboard>

</BeginStoryboard>

</EventTrigger>

</Style.Triggers>

</Style>

</Window.Resources>

 

<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">

<Button>0</Button>

<Button>1</Button>

<Button>2</Button>

<Button>3</Button>

<Button>4</Button>

<Button>5</Button>

<Button>6</Button>

<Button>7</Button>

<Button>8</Button>

<Button>9</Button>

</StackPanel>



 


by 피요히코~ 2009. 2. 25. 13:10
| 1 ··· 4 5 6 7 8 9 10 11 |