한창 신나게 테스트를 진행 한 후 ID 증가값을 초기화 하고 싶을 때

 

ID 사양을 아니요로 했다가 다시 예로 변경하려하면

 

아래의 메시지가 뜨면서 테이블을 다시 만들라고 나온다....T_T 덜덜..

 

 

"변경 내용을 저장할 수 없습니다. 변경 내용을 적용하려면 다음 테이블을 삭제하고 다시 만들어야합니다......."

 

 

 

 

 

취소하고 아래의 쿼리를 실행하면 아래의 결과 메시지를 출력하며 ID 증가값을 초기화 시킨다.

 

DBCC CHECKIDENT(‘테이블명’,RESEED,0);

 

 

 

'기타 프로그래밍 > Query' 카테고리의 다른 글

[MSSQL] 컬럼 변경시 경고 메세지  (0) 2013.03.13
Access 형변환 함수  (0) 2012.09.25

자동 증가하는 Number를 주기 위해 LoadRow 이벤트를 등록 후 이벤트가가 발생하면 해당 Row Index+1의 값을 RowHeader로 설정한다.

 

 

 

        /// <summary>

        /// Row 개체가 생성되면 발생합니다.

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void table_LoadingRow(object sender, DataGridRowEventArgs e)

        {

            e.Row.Header = (e.Row.GetIndex()+1).ToString();

        } 

 

 

 

 

            for (int i = 0; i < this.table.Items.Count; i++)

            {

                var obj = this.table.ItemContainerGenerator.ContainerFromIndex(i);

                if (Validation.GetHasError(obj) == true)

                {

                    MessageBox.Show(string.Format("테이블 {0}번째 데이터가 잘못 입력되었습니다.",i.ToString()), "에러", MessageBoxButton.OK, MessageBoxImage.Error);

                    return;

                }

            } 

 

Page Class에는 WindowState 속성이 없다.

 

전체 화면을 구현하기 위해서는 Frame을 NavigationWindow로 설정하면 된다.

 

NavigationWindow에서 Page를 설정하는 방법은 아래와 같다.

 

 

<NavigationWindow x:Class="ARCROM.GIFMaker.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        Title="MainWindow" Height="300" Width="300" Source="MainPage.xaml" WindowState="Maximized">

</NavigationWindow> 

 

Page를 이용해서 프로그램을 구현 도중 GoForward 및 GoBack을 수행하면 Textbox의 Text속성의 바인딩이 해제된다.

 

구글링 결과 Text의 바인딩 부분은 기록하지 못한다는 내용을 찾았다.

 

결론은 Page의 속성 중 KeepAlive의 값을 True로 설정하라는 것 이었다.

 

        //

        // 요약:

        //     System.Windows.Controls.Page 인스턴스가 탐색 기록에 유지되는지 여부를 나타내는 값을 가져오거나 설정합니다.

        //

        // 반환 :

        //     System.Windows.Controls.Page 인스턴스가 탐색 기록에 유지되면 true이고, 그렇지 않으면 false입니다.기본값은

        //     false입니다.

        public bool KeepAlive { get; set; }

 

 

R&D 프로젝트가 나에게로 왔다.

 

1차년도가 마무리 되는 시점에서 간단한 응용 프로그램이 나와줘야해서 WPF로 개발하기로 하였다.

 

WPF 학습 시간때문에 MVVM 패턴을 아직 익히지 못하였다........ㅜㅠ

 

암튼 Winform에서 Singleton 패턴을 자주 이용하던 나는 WPF에서도 Singleton 개체를 사용하였다.

 

Xaml에서 Singleton 개체에 접근 하는 방법을 찾다가 블로그에 포스팅한다.

 

 

 

먼저 Global 개체의 Namespace를 지정한다.

 

xmlns:gl="clr-namespace:ARCROM.GIFMaker.BusinessLogic;assembly=ARCROM.GIFMaker.BusinessLogic" 

 

 

 

그 다음 바인딩할 개체의 컨트롤에 아래와 같은 형식으로 바인딩을 한다.

GeometryInfo 개체의 River 속성의 set 접근지정자는 internal 이므로 TwoWay로 지정하면 XamlParseException이 발생한다.

 

<TextBox Text="{Binding Source={x:Static gl:Global.Singleton},Path=GeometryInfo.River,Mode=OneTime}"/> 

 

 

 

 

 

Global Class 구조

    public class Global

    {

        #region Singleton

        public static Global Singleton{get;private set;}

       

        static Global()

        { Singleton = new Global(); }

        private Global()

        { }

        #endregion

 

       

 

        /// <summary>

        /// 지형 파일 정보

        /// </summary>

        public Websolus.HECRAS.Data.GeometryInfo GeometryInfo { get; private set; }

              ........................ 

 

GeoSelection Class 구조

     public class GeometryInfo

    {

        /// <summary>

        /// 하천명

        /// </summary>

        public string River { get; internal set; }

        /// <summary>

        /// 유역명

        /// </summary>

        public string Reach { get; internal set; }

    }

 

 

Winform에서 DaumMapAPI를 컨트롤하기 위해

 

그동안 WebBrowser 컨트롤을 이용해 띄워었습니다.

 

잘 동작하는줄만 알았지만

 

문제가 하나 있었습니다.

 

 

 

 WebBrowser 컨트롤이 Focus를 잃었다가 다시 얻으면 Wheel Event가 발생되지 않는 문제였습니다.

 

 

 

 

해결한 내용입니다.

 

우선 WebBrowser컨트롤을 상속받은 Class에서 WndProc(윈도우 프로시져) 메서드를 override합니다.

 

그 후 아래의 코드를 작성합니다.

 

Msg 528은 마우스 Button Click에 관한 내용입니다.

 

 

 

mshtml.HTMLDocumentClass hDoc;

 

        private void DaumMapAPI_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)

        {

            this.hDoc = (mshtml.HTMLDocumentClass)this.Document.DomDocument;

        }

 

 

 

        protected override void WndProc(ref Message m)

        {

            //Mouse Button Click할때 포커스 발생시키기

            if (this.hDoc != null && m.Msg==528&&this.hDoc.hasFocus()==false)

                this.hDoc.focus();

            base.WndProc(ref m);

        }

 

 

 

 

 

 

 

 

 

빈줄 제거프로그램입니다.

 

.NetFramework 4.0이 설치 되어있어야합니다.

 

인터넷에서 문자열을 Copy&Paste하여 작업할때

 

빈줄이 삽입되어 복사가 될때 있습니다.

 

 

 

[이미지 1] 프로그램 화면

 

 

저는 소스코드를 Copy&Paste할 경우가 많은데

 

Paste시에 빈줄이 너무 삽입되어 노가다로 빈줄을 지울 경우가 좀 있었습니다ㅜㅠ

 

답답해서 프로그램으로 작성해놓았습니다.

 

 

 

왼쪽 창에 원본 문자열을 넣으시고

 

"빈줄 제거하기" 버튼을 클릭하시면 오른쪽에 변환된 문자열의 결과가 뜹니다.

 

자동으로 클립보드에 복사되므로 바로 작업을 진행하셔도 됩니다.

 

 

[이미지2] 결과화면

 

 

빈줄 제거 프로그램v1.0.0.1.exe

 

애니메이션을 이용해 버튼 깜빡이는 효과를 내는 코드입니다.

얼마전부터 WPF 학습을 시작해서 많이 허접합니다.

따로 설명을 안하고 코드상의 주석으로 대신하겠습니다.

 

 

 

Xaml 코드 입니다.

 

<Window.Resources>

        <Storyboard x:Key="sbBlinking">

            <!--타겟을 버튼으로두고, 타겟속성을 Opacity Opacity값을 1에서 0.3으로 줄였다가

             AutoReverse True이므로 다시 0.3에서 1 증가를 RepeatBehavior Forever이므로 무한정 반복-->

            <DoubleAnimation Storyboard.TargetName="btnStartOrEnd"

                             Storyboard.TargetProperty="Opacity"

                             From="1" To="0.3" Duration="0:0:1" RepeatBehavior="Forever"

                             AutoReverse="True">

            </DoubleAnimation>

        </Storyboard>

    </Window.Resources>

    <Canvas>

        <Label Name="lblState" Canvas.Left="54" Canvas.Top="10">Waiting</Label>

        <Button Click="btnStartOrEnd_Click"  Name="btnStartOrEnd" Content="Start" Height="23" Width="75" Margin="282,135,130,141" Canvas.Left="-127" Canvas.Top="-122" />

    </Canvas>

</Window> 

 

 

 

cs 코드입니다.

 

   

 /// <summary>

    /// MainWindow.xaml 대한 상호 작용 논리

    /// </summary>

    public partial class MainWindow : Window

    {

        const string TXT_START = "Start";

        const string TXT_DISCONNECT = "Disconnect";

        const string TXT_CONNECTING = "Connecting..";

        const string TXT_CONNECTED = "Connected!";

        const string TXT_WAITING = "Waiting..";

       

 

        public MainWindow()

        {

            InitializeComponent();

            this.Loaded += new RoutedEventHandler(MainWindow_Loaded);

        }

 

        void MainWindow_Loaded(object sender, RoutedEventArgs e)

        {

            this.btnStartOrEnd.Content = TXT_START;

        }

 

        private void btnStartOrEnd_Click(object sender, RoutedEventArgs e)

        {

            if (this.btnStartOrEnd.Content.Equals(TXT_START))

            {

                //Start

                this.TryConnect();

            }

            else if (this.btnStartOrEnd.Content.Equals(TXT_DISCONNECT))

            {

                //Disconnect

                this.UpdateUIContent(TXT_START, TXT_WAITING);

            }

        }

 

        /// <summary>

        /// 연결을 시도합니다.

        /// </summary>

        private void TryConnect()

        {

            //버튼과 레이블의 Content 변경하고

            this.UpdateUIContent(TXT_WAITING, TXT_CONNECTING);

            this.btnStartOrEnd.IsEnabled = false;

 

            //스토리보드 시작을 하고

            Storyboard sb = this.Resources["sbBlinking"] as Storyboard;

            //sb.Begin(this.btnStartOrEnd); //Xaml에서 지정하지 않을 경우 cs에서 직접 지정

            sb.Begin();

 

            //연결이 3 성공하였다고 가정한다.

            System.Windows.Threading.DispatcherTimer timer = new System.Windows.Threading.DispatcherTimer(new TimeSpan(0, 0, 3),

                  System.Windows.Threading.DispatcherPriority.SystemIdle, this.ConnectSuccess, this.Dispatcher);

        }

 

        /// <summary>

        /// 연결에 성공하였습니다.

        /// </summary>

        /// <param name="state"></param>

        //public void ConnectSuccess(object state)

        public void ConnectSuccess(object sender, EventArgs e)

        {

            System.Windows.Threading.DispatcherTimer timer = sender as System.Windows.Threading.DispatcherTimer;

            timer.Stop();

 

            this.UpdateUIContent(TXT_DISCONNECT, TXT_CONNECTED);

 

            Storyboard sb = this.Resources["sbBlinking"] as Storyboard;

            sb.Stop();

 

            this.btnStartOrEnd.IsEnabled = true;

        }

 

        /// <summary>

        /// 상태 UI 갱신합니다.

        /// </summary>

        /// <param name="btnContent"></param>

        /// <param name="lblContent"></param>

        private void UpdateUIContent(string btnContent, string lblContent)

        {

            this.btnStartOrEnd.Content = btnContent;

            this.lblState.Content = lblContent;

        }

    }

 

응용 프로그램 개발 후 테스트를 하다보면 가끔 특정 PC에서 파일에 접근할 수 없는 권한 문제가 발생하곤 합니다.

 

얼마 전 Window8에서 팀장님이 테스트를 해보셨는데 권한 문제가 발생하였습니다…T T…

ClickOnce를 이용해 아주 간단하게 항상 관리자 권한을 얻을 수 있도록 설정 할 수 있습니다.

ClickOnce를 설정하면 자동으로 app.manifest라는 xml파일이 생성 되는데, 특정 부분만 살짝 변경해주면 됩니다.

 

VisualStudio2010 기준으로 설명하겠습니다.

 

 

프로젝트 속성->보안->ClickOnce 보안 설정 사용 체크해주세요.

                              [이미지 1] ClickOnce 보안 설정 사용 체크

 

 

app.manifest 파일이 생성되었는지 확인해주세요.

                               [이미지 2] 생성된 app.manifest 파일 확인

 

 

ClickOnce 보안 설정 사용을 다시 체크 해제해주세요.

                                              [이미지 3] ClickOnce 보안 설정 사용 해제

 

requestedExcutionLevel의 level 속성을 asInvoker에서 requireAdministrator로 변경해주세요.

 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

  

 

                                         [이미지 3] app.manifest 파일 수정

+ Recent posts