퇴근5분전

KT에 잠깐 있을때 부탁받았던 내용인데

특정 테이블 폼을 파싱해서 HTML테이블과 데이타만 남기고 이를 dataTable로 만들어서 쿼리를 만드는 프로그램을 만들고 있었음.

이후.. 옆에 동료의 사정에 귀기울여 만들던 것을 멈췄음.

정규식을 모를때라서 이렇게 된다!!
<로 시작해서 > 끝나는걸 찾아서 Table관련 태그면 그에 맞춰서 작업했던 기억이 남.



  #region  HTML 태그 제거

  /*  TD태그 안에 다른 태그들 삭제! */
  string TdFilter(string TDString)
  {
   System.Text.StringBuilder  sb  = new System.Text.StringBuilder(); 
     
   // Name  =      2테이블1Row 1Col 은 name

   // TableData =  3테이블1Row는 컬럼명
   //           =  3테이블2Row부터는 데이타


   if( TDString.IndexOf("<",0) == -1 ||  TDString.IndexOf(">",0) == -1 || TDString.IndexOf("html",0) == -1 ||  TDString.IndexOf("head",0) == -1)
   {
    MessageBox.Show("완전한 html이 아닙니다.","Warning - [html, head 미포함!]", MessageBoxButtons.OK, MessageBoxIcon.Warning);
    return TDString;
   }

   string strTagArea = string.Empty;   
   int   sIndx = 0;
   int   eIndx = 0;
   int   cnt  = 0;

   int TableDepthCnt  =  0; 
   int TrCnt = 0;
   int TdCnt  = 0;

   string TagName = "";

   
   DataRow dr = dt.NewRow();

   try
   {
    foreach( char cc in TDString)
    {
     if( cc.CompareTo('<') == 0 )
     {
      // > ~ (<)
      if( cnt > eIndx)
      {
       strTagArea = TDString.Substring( eIndx + 1 ,cnt -  eIndx -1 );
       sb.Append( strTagArea.Replace(Environment.NewLine,"").Replace("\n","").Replace("\t","").Trim());
     
       switch(TagName)
       {
        case "TD":
         if( TableDepthCnt == 2 && TrCnt == 1 && TdCnt == 1)
         {
          dt.TableName = strTagArea;
         }
         else if(TableDepthCnt == 3 && TrCnt == 1)
         {          
          dt.Columns.Add( strTagArea );          
         }
         else if(TableDepthCnt == 3 && TrCnt > 1)
         {           
          dr[ TdCnt - 1 ] = strTagArea;
         }
         break;
        case "TR":
         if( TableDepthCnt == 3 && TrCnt > 1 )
         {          
          dr = dt.NewRow();
         }
         break;
        case "</TR>":
         if( TableDepthCnt == 3 && TrCnt > 1)
         { 
                    
          dt.Rows.Add( dr );                
         }
         break;
       }
      }   
      sIndx  = cnt;
     }
     else if( cc.CompareTo('>') == 0)
     {     
      eIndx = cnt;
      strTagArea = TDString.Substring( sIndx , eIndx - sIndx + 1 );
      if( strTagArea.Substring(1,2).ToUpper().CompareTo("TD") == 0 )
      { 
       TagName = strTagArea.Substring(1,2).ToUpper();    
       sb.Append( strTagArea + Environment.NewLine); 
       TdCnt++;
      }
      else if( strTagArea.ToUpper().CompareTo("</TD>") == 0)
      {
       TagName = strTagArea.ToUpper();
       sb.Append( strTagArea + Environment.NewLine); 
      }
      else if(strTagArea.Substring(1,2).ToUpper().CompareTo("TR") == 0 )
      {
       TagName = strTagArea.Substring(1,2).ToUpper();
       TrCnt ++;
       TdCnt = 0;      
       sb.Append( strTagArea + Environment.NewLine);
      }
      else if ( strTagArea.ToUpper().CompareTo("</TR>") == 0)
      {    
       TagName = strTagArea.ToUpper();
       sb.Append( strTagArea + Environment.NewLine); 
      }
      else if(strTagArea.Substring(1,2).ToUpper().CompareTo("TA") == 0 )
      {   
       TagName  = strTagArea.Substring(1,2).ToUpper();
       TableDepthCnt ++;
       TrCnt = 0;
       TdCnt  = 0;
       sb.Append( strTagArea + Environment.NewLine); 
      }
      else if(strTagArea.ToUpper().CompareTo("</TABLE>") == 0)
      {     
       TagName = strTagArea.ToUpper();
       sb.Append( strTagArea + Environment.NewLine);       
      }         
     }
     cnt++;
    }
   }
   catch{}
   this.dataGrid1.DataSource = dt;
   this.Text = dt.Rows.Count.ToString();
   return sb.ToString();
  }


참길다!!


<html><head>
<body>
<table>
 <tr><td></td><td></td>
 </tr>
</table>
<table>
 <tr><td>TableA </td><td></td>
 </tr>
</table>
<table>
 <tr><td> A </td><td>B</td></tr>
 <tr><td>1</td><td>2</td></tr>  
 <tr><td>1</td><td>2</td></tr>  
 <tr><td>1</td><td>2</td></tr>  
 <tr><td>1</td><td>2</td></tr>  
 <tr><td>1</td><td>2</td></tr>  
</table>
</body>
</head></html>

이런 소스를  DataTable로 만든후 쿼리를 만들려고 했었음.

적용후 나오는 DataTable을 DataGrid에 담은 모습임.




'# 2) .Net ( Vs 2005 ) > 기타' 카테고리의 다른 글

트리뷰] 트리뷰 노드추가하기 2  (0) 2009.05.09
트리뷰] 트리뷰 노드추가하기 1  (0) 2009.05.09
게임 챗팅창처럼...  (0) 2009.05.09
드레그 앤 드랍! (2)  (0) 2009.05.09
드래그 앤 드랍!  (0) 2009.05.09

< 실행 화면 >

게임 채팅 처럼 아래서 위로 올라가는 건뎅...
새로 시작해서 첫줄을 넣었을때 나오는 화면임.

그 당시 복잡한 방법으로 만든기억이남.
우선 구현은 해보고 그 다음 더 좋은 방법으로 만들어가기 위해서...

// 소스
string[] storeChat = new string[50];
const  byte  byViewLineCount = 20;
int   iCurrentLine =  0;


 private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
  {

   if(e.KeyCode == Keys.Enter)
   {
    if(this.textBox1.Text.CompareTo("") == 0 || this.textBox1.Text.CompareTo( string.Empty) == 0)
     return;
    SaveViewChat( this.textBox1.Text);
    ViewStrings();
    this.textBox1.Clear();
   }
  }

  private void SaveViewChat( string Chat)
  {
      
   if(iCurrentLine + 1 == storeChat.Length)
   {
    Swap();
    iCurrentLine = storeChat.Length - 2;
   }
   storeChat[iCurrentLine] =  Chat;
   iCurrentLine++;
  }

 private void ViewStrings()
  {
   System.Text.StringBuilder sb  = new System.Text.StringBuilder();

   int count  = ( iCurrentLine > byViewLineCount ? byViewLineCount: iCurrentLine);
   if(iCurrentLine < byViewLineCount)
   {
    for( int i = 0; i < byViewLineCount - iCurrentLine ; i ++)
    {
     sb.Append( Environment.NewLine );
    }
   }
   for(int i  =  count - 1 ; i >= 0 ; i--)
   {
    sb.Append( string.Format("{0} : {1}" , i , storeChat[(iCurrentLine-1) - i] + Environment.NewLine) );    
   }   
   
   this.textBox2.Text = sb.ToString().Substring(0, sb.Length -2);
   this.textBox2.Select(this.textBox2.TextLength, 0);
   this.textBox2.ScrollToCaret();
   this.textBox2.Update();
  }
  private void Swap()
  {
   string strTemp = string.Empty;
   for(int i = 0; i < storeChat.Length - 1 ; i ++)
    storeChat[i] = storeChat[i + 1];
  }



소스가 간단하니 주석은 안넣음.

총 50라인을 저장하고
이중에 최근 20개를 보여줌.







'# 2) .Net ( Vs 2005 ) > 기타' 카테고리의 다른 글

트리뷰] 트리뷰 노드추가하기 1  (0) 2009.05.09
Html Table 파싱  (0) 2009.05.09
드레그 앤 드랍! (2)  (0) 2009.05.09
드래그 앤 드랍!  (0) 2009.05.09
Ms-Sql을 띠우자!  (0) 2009.05.08

'# 2) .Net ( Vs 2005 ) > 기타' 카테고리의 다른 글

Html Table 파싱  (0) 2009.05.09
게임 챗팅창처럼...  (0) 2009.05.09
드래그 앤 드랍!  (0) 2009.05.09
Ms-Sql을 띠우자!  (0) 2009.05.08
데이타테이블 컬럼위치 바꾸기  (0) 2009.05.08

드레그 앤 드랍 테스트 및 구현.

소스             = >           대상

0.대상.AllowDrop  = true;

1. 소스.MouseDown, Move, Up 중에
소스.DoDragDrop() 호출하면서 전달데이타 패킹
 ex) 소스.DoDragDrop( "Drag&Drop", DragDropEffects.All | DragDropEffects.Copy  );
 
2. 대상.DragOver 이벤트에서 e.Effect 를 결정
 ex) e.Effect =  DragDropEffects.All;

3. 대상.DragDrop 이벤트
        ex)
 if (e.Data.GetDataPresent(typeof(System.String)))
 {
  Object item = (object)e.Data.GetData(typeof(System.String));
  // Perform drag and drop, depending upon the effect.
//  if (e.Effect == DragDropEffects.All)// Over에서 Effect에 열거형과 같은지 체크해서 적용여부결정
//  {               
   this.textBox1.Text = item.ToString();   
//  }
 }        

간단하게  정리 한것이며.
복잡하게 구현될수도 있음.

차후 디자이너 같은 프로그램을 만들어낼 때 한번 해볼까 싶다.


// 예제 소스중에 일부..  아래순서대로 일어나게됨.

textBox1.ArowDrop = true;   상태임.

private void button1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
  {
   if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
   {
    button1.DoDragDrop( "Drag&Drop", DragDropEffects.All | DragDropEffects.Copy  );
   }
  }

  private void textBox1_DragOver(object sender, System.Windows.Forms.DragEventArgs e)
  {
   e.Effect =  DragDropEffects.All;
  }

  private void textBox1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
  {

   if (e.Data.GetDataPresent(typeof(System.String)))
   {

    Object item = (object)e.Data.GetData(typeof(System.String));

    // Perform drag and drop, depending upon the effect.
//    if (e.Effect == DragDropEffects.Copy)
//    {               
     this.textBox1.Text = item.ToString();   
//    }
   }  
  }

처리되는 이미지 캡쳐가 안되서 이미지 첨부 안함!


훈스에 트리뷰 관련해서 드래그앤드랍으로 답변단것이 있음
찾아서 올려야징!

'# 2) .Net ( Vs 2005 ) > 기타' 카테고리의 다른 글

게임 챗팅창처럼...  (0) 2009.05.09
드레그 앤 드랍! (2)  (0) 2009.05.09
Ms-Sql을 띠우자!  (0) 2009.05.08
데이타테이블 컬럼위치 바꾸기  (0) 2009.05.08
이벤트  (0) 2009.05.08

System.Diagnostics.ProcessStartInfo  pcssinfo
= new System.Diagnostics.ProcessStartInfo( "isqlw", dbString[ Dbtype.STG ]);
System.Diagnostics.Process.Start( pcssinfo );

isqlw 는 2000 일때의 실행 파일명이었던듯 함.
사용자 삽입 이미지

이건 SqlManager의 속성을 보면 실행파일명이 나오는데
cmd 창에   실행명 /? 을 넣으면 위와 같은 알림창이 뜸.
위 정보를 이용해서 매니져를 여러개의 데이타베이스 서버중에 서버를 지정해서 접속이 가능함.

'# 2) .Net ( Vs 2005 ) > 기타' 카테고리의 다른 글

드레그 앤 드랍! (2)  (0) 2009.05.09
드래그 앤 드랍!  (0) 2009.05.09
데이타테이블 컬럼위치 바꾸기  (0) 2009.05.08
이벤트  (0) 2009.05.08
Enum 과 Enum 비트 마스크  (0) 2009.05.08

전에 데이타그리드뷰를 다뤄보다가 열이동을 보다가 직접 만들어본 메서드임.



// 데이타 테이블에 담긴 컬럼을 위치를 바꾸는 메서드.  
  private DataTable ChangColumn(DataTable  sourceDt ,int ColumnIndex1 , int ColumnIndex2 )
   {
    DataTable dt  = new DataTable();
    if( sourceDt == null) return dt;

    for(int i = 0; i < sourceDt.Columns.Count ; i ++)
    {
     if( i == ColumnIndex1)
     {
      dt.Columns.Add( sourceDt.Columns[ ColumnIndex2 ].ColumnName );
     }
     else if ( i == ColumnIndex2 )
     {
      dt.Columns.Add( sourceDt.Columns[ ColumnIndex1 ].ColumnName );
     }    
     else
     {
      dt.Columns.Add( sourceDt.Columns[i].ColumnName );
     }
    }

    foreach( DataRow dr  in sourceDt.Rows )
    {
     DataRow insertDr  =  dt.NewRow();

     for(int j = 0; j < dr.ItemArray.Length ; j ++)
     {
      if( j == ColumnIndex1)
      {
       insertDr[j] = dr[ ColumnIndex2 ];
      }
      else if ( j == ColumnIndex2 )
      {
       insertDr[j] = dr[ ColumnIndex1 ];      
      }     
      else
      {
       insertDr[j] = dr[ j ];      
      }
     }
     dt.Rows.Add( insertDr );
    }

    return dt;

   }


//  datatable.Rows.Insert() 와  datatable.ImportRow()
에서

같은 Hash코드를 가진(동일 메모리 공간) Row를 DataTable에 입력시

ImportRow는 적용되지만 Insert()는 안됨.

해당 RowCollection 과 관련되어
Insert시 해당 컬렉션에 DataRow가 존재하며 에러 반환.
Import는 있든 없든 무조건 DataRow를 복사해서 추가함.

ex)
  1 : DataRow drd  = ds.Tables[0].NewRow();
  2 :   DataRow drd  = ds.Tables[0].Rows[0];

 ds.Tables[0].Rows.Add( drd); 
 ds.Tables[0].ImportRow( drd );  

2 -> Add나 Insert 는 안들어감. Import는 들어감.


'# 2) .Net ( Vs 2005 ) > 기타' 카테고리의 다른 글

드래그 앤 드랍!  (0) 2009.05.09
Ms-Sql을 띠우자!  (0) 2009.05.08
이벤트  (0) 2009.05.08
Enum 과 Enum 비트 마스크  (0) 2009.05.08
Xml 직렬화...  (0) 2009.05.08

객체지향 을 처음 관심을 둘때
내가 만든 객체도 어떤 이벤트에 대한 동작을 해야 하지 않는가? 라는 의문이 생기면서
방법을 찾다가 한참만에 찾았었음.

Vs2003으로 되있는걸 보면... 웹할때인듯 한데 C#시작하고 1년이 넘어서인가보다.

이벤트란?  객체에 어떤행동이나 상태변화등에 특정 행동을 정의 함으로써
그 행동이나 상태변화에 대응하기 쉽게함.

곧 사람이 외부에서 때렸을때 악! 소리를 낸다라든가?
밥을 먹다보니 위가 가득 차서 배부르다는 느낌을 받는다든가?


EventObject    evtObj = new EventObject();
 ...
evtObj.intState_EventHandle  +=new intState(evtObj_intState_EventHandle);
...
private void evtObj_intState_EventHandle() // 이벤트 발생시 두번째 호출
{
    MessageBox.Show("값을 바꿨네!");
}

 evtObj.EventTarget = 10;  // 이벤트 발생 시점이 됨.

 delegate  void intState();

 class    EventObject
 {
  int  eventTarget =  0;

  public EventObject()
  {
   this.intState_EventHandle +=new intState(StateChange);
  }

  public int EventTarget
  {
   get { return this.eventTarget;}
   set {
     int i = this.eventTarget;
     
     this.eventTarget = value;

     if( i != this.eventTarget && intState_EventHandle != null)
       intState_EventHandle();
   }
  }
 
  public event intState     intState_EventHandle;

  public  void  StateChange()
  {
    MessageBox.Show("누가 바꾸래!");              // 이벤트 발생시 처음 호출

  }

 }


이벤트가 발생시 이벤트 처리자로 추가된 순서대로 호출이 됨.


// 아참 떠오르는건 엄준일님 이벤트 강좌를 보고 이걸 했던것 같음.

'# 2) .Net ( Vs 2005 ) > 기타' 카테고리의 다른 글

Ms-Sql을 띠우자!  (0) 2009.05.08
데이타테이블 컬럼위치 바꾸기  (0) 2009.05.08
Enum 과 Enum 비트 마스크  (0) 2009.05.08
Xml 직렬화...  (0) 2009.05.08
정규식] 똑같은 글자가 몇개?  (2) 2009.05.08

Enum 클래스...


enum 선언
    enum  변수명 { 인자1, 인자2,... 인자n };
 주의 : 문자열이라도 "인자1" 표기가 아님.


사용
    고정된 코드성 데이타 표현을 이용하거나 style같은 데이타 표현시 이용.


Enum.Format( typeof( enum변수 ) ,    enum변수.선택인자 ,  stringFormat )

stringFormat : 식 문자열은 "G","g","X","x","F","f","D" 또는 "d"만 될 수 있습니다.


비트 마스크 이용


enum GoFlag {left= 0x0001, right = 0x0010, up = 0x0100, down = 0x1000};

 GoFlag  aaa  = GoFlag.left | GoFlag.down

입력 받았을시..

 추출..


if( aaa & GoFlag.left == GoFlag.left )
{ left 처리 }

if( aaa & GoFlag.down != GoFlag.down )
{ down 처리 }
...

프로세스 흘려보내면 됨.


'# 2) .Net ( Vs 2005 ) > 기타' 카테고리의 다른 글

데이타테이블 컬럼위치 바꾸기  (0) 2009.05.08
이벤트  (0) 2009.05.08
Xml 직렬화...  (0) 2009.05.08
정규식] 똑같은 글자가 몇개?  (2) 2009.05.08
PWD 암호화 객체.  (0) 2009.05.08


xml직렬화메서드...
{
 serializeObject  xobj = new serializeObject();
 XmlWriter xWriter = new XmlTextWriter("myInfo.xml", Encoding.Unicode);
 //여기에 객체 타입을 넣습니다.
 XmlSerializer serializer = new XmlSerializer(xobj.GetType());
 serializer.Serialize(xWriter, xobj);   
 xWriter.Close();
}


 // xml직렬화 될 class
 [Serializable()]
 public class serializeObject
 {
  public string aaa  = "aaa";
  public string bbb  = "bbb";
  public string ccc  = "ccc";

//  public  string AA
//  {
//   get{return aaa;}
//   set{aaa = value;}
//  }
//
//  public  string BB
//  {
//   get{return bbb;}
//   set{bbb = value;}
//  }
//
//  public  string CC
//  {
//   get{return ccc;}
//   set{ccc = value;}
//  }
 }


--> xml직렬화 된 결과 파일 내용.

<?xml version="1.0" encoding="utf-16" ?>
<serializeObject xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <aaa>aaa</aaa>
 <bbb>bbb</bbb>
 <ccc>ccc</ccc>
</serializeObject>


// 참고 : Form이나 Control로 해봤는데 안되넹...


이것도 오래전에 따라 해보던 것임.
지금 만들라고 하면..
리플렉션을 이용해서 직접 만들것 같음.

'# 2) .Net ( Vs 2005 ) > 기타' 카테고리의 다른 글

이벤트  (0) 2009.05.08
Enum 과 Enum 비트 마스크  (0) 2009.05.08
정규식] 똑같은 글자가 몇개?  (2) 2009.05.08
PWD 암호화 객체.  (0) 2009.05.08
인터페이스와델리게이트조합1  (2) 2009.05.08

문자열이 몇개가 포함되어 있는지 체크 하는 기능 


this.richTextBox1.Text = "abc 가나다 abc가나다 가abc나다 가나다 ab ac bc  가나abc다abc";

System.Text.RegularExpressions.Regex  rg = new System.Text.RegularExpressions.Regex("abc");

MessageBox.Show( rg.Matches( this.richTextBox1.Text , 0).Count.ToString() );

결과창 : 5  

정규식 관련해서는 훈스닷넷에 레몬님께 도움을 많이 받았음.

오래전에 질문글에 올라온걸 답변하면서 작성한 코드임.
간단한 것정도만 아직 가능함.
어려운건 역시 어려움...

'# 2) .Net ( Vs 2005 ) > 기타' 카테고리의 다른 글

Enum 과 Enum 비트 마스크  (0) 2009.05.08
Xml 직렬화...  (0) 2009.05.08
PWD 암호화 객체.  (0) 2009.05.08
인터페이스와델리게이트조합1  (2) 2009.05.08
DB로컬 연결시 문구  (0) 2009.05.02