RadGrid의 DetailTable 컬럼 크기 조절

 

ItemDataBound.... 이벤트에서.

 

//item["EMPTY"].Width = new Unit(75,UnitType.Pixel);    <--설정했지만 크기가 안변함.

//상부로 올려서 헤드를 설정해야 된다는..
item.OwnerTableView.GetColumn("EMPTY").HeaderStyle.Width = Unit.Pixel(75);

 

출처 :  https://www.telerik.com/forums/how-to-set-column-width-in-code-behind-for-detailtable

 

 

 

위에서 크기만 변경되고. Refresh 시.. 기본값으로 초기화됨.

ItemCreate 이벤트에서 설정해주어야함.

 

컬럼 전체가 되니..

DetailTable.KeyValue 로 구분하여..  처리해야함.

근데, 구분자가.. 다행히  ExpandCollapseColumn.Display 발생했던 문제였으므로,

이것으로 구분함. (문제발생한 부분이 구분값의 키구나..)

 

protected void rgClnDept_ItemCreated(object sender, GridItemEventArgs e)
 {
  if (e.Item is GridDataItem)
  {
   GridDataItem item = (GridDataItem)e.Item;

   string[] strKeyValue = item.KeyValues.ToString().Replace("{", "").Replace("}", "").Split(':');

   //키가없으면 기본항목
   if (strKeyValue.Length == 1)
   {

   }
   else if ("CntrNm".Equals(strKeyValue[0]))
   {
     if (!item.OwnerTableView.ExpandCollapseColumn.Display)
     {
      item.OwnerTableView.GetColumn("EMPTY").HeaderStyle.Width = Unit.Pixel(75);
     }
  }
  }
 }

 

출처 : https://www.telerik.com/forums/issue-hiding-detail-table-column-in-self-referencing-hierarchical-grid

 

 

Posted by 말없제이
,

//연결정보 웹 콘피그 내용
string connectionString = "Data Source=XXX;Initial Catalog=XXX;User Id=XXX;Password=XXX;Application Name=TEST";
   
System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection(connectionString);

try
{
 connection.Open();

 System.Data.SqlClient.SqlBulkCopy oBulk = new System.Data.SqlClient.SqlBulkCopy(connection);

 oBulk.DestinationTableName = "XXXX.dbo.MyDataValues"; //자기가 연은 카탈로그에서 실행
 oBulk.BatchSize = 10000;

 DataTable dtUpd = new DataTable();
 dtUpd.Columns.Add("MyDataID", typeof(string));
 dtUpd.Columns.Add("ColSeq", typeof(Int16));
 dtUpd.Columns.Add("RowSeq", typeof(int));
 dtUpd.Columns.Add("ColVal", typeof(string));
 DataRow row;

 foreach (var vrListIn in pList)
 {
  row = dtUpd.NewRow();
  row["MyDataID"] = vrListIn.MyDataID;
  row["ColSeq"] = vrListIn.ColSeq;
  row["RowSeq"] = vrListIn.RowSeq;
  row["ColVal"] = vrListIn.ColVal;
  dtUpd.Rows.Add(row);
 }

 oBulk.WriteToServer(dtUpd);

 oBulk.Close();
 dtUpd = null;

}
catch (Exception ex)
{
 
}
finally
{
 if (connection != null)
 {
  connection.Close();
 }
}

Posted by 말없제이
,

구글의 RadPane .. SpeedRatio 관련으로 검색으로 비슷한유형

전혀 쓰지마란 얘기라서.

 

애니메이션을 찾아보니... Group 안에 넣어야 하는데

귀차니즘으로 그냥..그룹없이 애니메이션에 넣어도 적용됨..

 

TargetElementName="PopupChild" 는 Fixed(고정임)..

 

일부로 다른 오브젝트 elementName으로 넣었나..

타겟이 아닌 자기가 애니메이션 먹고있어씀. -= -

하부에 넣어도 안먹고, 지워서

snoop상에서 수정시 적용해 먹는거 보니..

명칭이 PopupChild 이였음 - -..

 

 

<telerik:RadDocking 
   x:Name="rdcDocking"
   BorderThickness="0"
   Padding="0"
   AllowUnsafeMode="True"
   Grid.Column="0"
   Grid.Row="0"
   >
    <telerik:AnimationManager.AnimationSelector>
     <telerik:AnimationSelector>
      <telerik:SlideAnimation
       AnimationName="LeftIn"
       Direction="In"
        Orientation="Horizontal"
       SpeedRatio="2"
        TargetElementName="PopupChild"
       >
      </telerik:SlideAnimation>
      <telerik:SlideAnimation
       AnimationName="LeftOut"
       Direction="Out"
       Orientation="Horizontal"
       SpeedRatio="2"
        TargetElementName="PopupChild"
       >
      </telerik:SlideAnimation>
     </telerik:AnimationSelector>
    </telerik:AnimationManager.AnimationSelector>
    <telerik:RadSplitContainer
    InitialPosition="DockedLeft"
    Width="450" >

.......

</ ... . .>

...

</ ... .>
    

Posted by 말없제이
,


[WPF] DataTemplate 안에서 ContextMenu의 바인딩

출처 : http://chanun.tistory.com/6
데이터 템플릿 안에있는 ContextMenu에, ViewModel에 있는 속성이나 커맨드 바인딩 방법중 하나 입니다.

1. ContextMenu를 갖게 되는 패널의 Tag속성에 ViewModel DataContext 바인딩
2. ContextMenu에 PlacementTarget.Tag 값을 DataContext로 지정한다.
3. MenuItem에 해당 Command 혹은 속성 바인딩

※ 동시에 DataTemplate의 DataContext나 그 속성을 사용해야 될경우 아래 CommandParameter 바인딩 처럼 구현하면 된다.

Xaml
<DataTemplate >
 <Grid Tag="{Binding Path=DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}">
  <Grid.ContextMenu>
   <ContextMenu DataContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}" >
    <MenuItem
     Header="아이템1"
     Command="{Binding Item1Command}"
     CommandParameter="{Binding DataContext, RelativeSource={RelativeSource TemplatedParent}}"
     />
    <MenuItem
     Header="아이템2"
     Command="{Binding Item2Command}"
     CommandParameter="{Binding DataContext, RelativeSource={RelativeSource TemplatedParent}}"
     />
   </ContextMenu>
  </Grid.ContextMenu>
 </Grid>
</DataTemplate>

※ ContextMenu.PlacementTarget 
ContextMenu가 열리는 위치의 기준이 되는 UIElement를 가져오거나 설정합니다. 이 속성은 종속성 속성입니다.

 

위에서 전체말고 바로상위단 선택값 파라메타 값 넘김.

출처 : http://stackoverflow.com/questions/8154202/pass-command-parameter-from-the-xaml

 ...
CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.SelectedItem}"

Posted by 말없제이
,

간단한것이 MVVM패턴에서는 바로 안먹혀서. 요리 조리 하다 시간 많이 걸림.


구글 검색 참조 : http://stackoverflow.com/questions/12540457/moving-an-item-up-and-down-in-a-wpf-list-box

//-- CS
private void btnUp_Click(object sender, EventArgs e)     
{     
if (radListBox1.SelectedIndex > 0)     
{     
int index = radListBox1.SelectedIndex;     
RadListBoxItem current = radListBox1.SelectedItem as RadListBoxItem;     
radListBox1.Items.Remove(current);     
radListBox1.Items.Insert(index - 1, current);     
radListBox1.SelectedIndex = index - 1;     
}     
}     

private void btnDown_Click(object sender, EventArgs e)     
{     
if ((radListBox1.SelectedIndex > -1) && (radListBox1.SelectedIndex < radListBox1.Items.Count - 1))     
{     
int index = radListBox1.SelectedIndex;     
RadListBoxItem current = radListBox1.SelectedItem as RadListBoxItem;     
radListBox1.Items.Remove(current);     
radListBox1.Items.Insert(index + 1, current);     
radListBox1.SelectedIndex = index + 1;     
}     
}    

 

//맞도록 변경해보장

//MVVM 패턴일경우 radListBox1.Items.Remove 요기서 ItemsSource 잡혀있어서 못쓴다고 날리다.
//MVVM에 맞게 수정 - 어언 7년전 C#에서 var 쓴다고 욕들먹은은 1인.

//-- XMAL
<Button
DockPanel.Dock="Top"
Content="▽"
Width="18"
Height="18"
Margin="0,0,0,5"
Command="{Binding DataContext.SltGrpItemDown, RelativeSource = {RelativeSource AncestorType={x:Type telerik:RadTabControl},AncestorLevel=2}}"
CommandParameter="{Binding ElementName=Model1SelectValue}"
/>
<telerik:RadListBox
Name="Model1SelectValue"
DockPanel.Dock="Right"
Margin="10,3,3,3"
ItemsSource="{Binding IChildSelection}"
>

//-- ViewModel
/// <summary>
/// 그룹들 위로 올리기
/// </summary>
public void OnSltGrpItemUp(object param)
{
//빈값이거나 타입값이 아니면 취소.
if (param == null) return;

var vrParam = (Telerik.Windows.Controls.RadListBox)param;

var vrCllct = vrParam.ItemsSource as Collection<DBSelections>;
var vrSlct = vrParam.SelectedItem;

if (vrSlct == null)
{
System.Windows.MessageBox.Show("항목을 선택하세요.");
return;
}

if (vrParam.SelectedIndex > 0)
{
int index = vrParam.SelectedIndex;
vrCllct.Remove(vrSlct);
vrCllct.Insert(index - 1, vrSlct);
vrParam.SelectedIndex = index - 1;
}

}

/// <summary>
/// 그룹들 아래로 내리기
/// </summary>
public void OnSltGrpItemDown(object param)
{
//빈값이거나 타입값이 아니면 취소.
if (param == null) return;

var vrParam = (Telerik.Windows.Controls.RadListBox)param;

var vrCllct = vrParam.ItemsSource as Collection<DBSelections>;
var vrSlct = vrParam.SelectedItem;

if (vrSlct == null)
{
System.Windows.MessageBox.Show("항목을 선택하세요.");
return;
}

if ((vrParam.SelectedIndex > -1) && (vrParam.SelectedIndex < vrParam.Items.Count - 1))     
{
int index = vrParam.SelectedIndex;
vrCllct.Remove(vrSlct);
vrCllct.Insert(index + 1, vrSlct);
vrParam.SelectedIndex = index + 1;
}

}

Posted by 말없제이
,

참조..
http://gonnie.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9E%90%EC%8B%9D%EC%B0%BD%EC%97%90%EC%84%9C-%EB%B6%80%EB%A7%88%EC%B0%BD-%ED%95%A8%EC%88%98%EC%A0%9C%EC%96%B4

원래 페이지에 상세설명 잘 되어있어요~~~.

 

[자바스크립트]자식창에서 부모창의 함수제어
프로그래밍/Java Script
먼저 부모창에 function test(){}이라는 함수가 있다고 가정한다.
1)팝업창일경우
opener.test();

2)iframe일경우
parent.test();
와 같이 호출하면 된다. (무지쉽지?)

3) 부모창에서 iframe내 함수접근
   var ifr = document.getElementById('iframeID');
    ifr.contentWindow.function_name();
부모창에서 'iframeID'이라는 iFrame에 지정된 페이지의 function_name()함수에 접근하는 방법이다.

4) <a href='www.url.com' target='_parent'>link</a>으로 지정해도 됨. 물론 자바스크립트를 제어하는 것은 아니라서
     parent.location.href='www.url.com';과 동일한 효과만 볼수 있음. 페이지 이동에 국한하여 사용할 수 있는 태그이다.
     기초적이고 간단한 것인데 종종 잊어먹곤 하니 유의할 것.

Posted by 말없제이
,

RadGrid(Telerik Web버전) Min Header

익스플러워 크기 변경시에도 최소 크기 보장? 안된다 - -

4일 걸렸음 - -. 웹페이지 크기에 따라 크기 줄이기도해보기도 했으나  --

 

HeaderStyle-Width에 그흔한 Min-Width 가 없다 -- "*"넣으면.. 당연히 에러 --

 

그러면 최소 크기 보장위해 2개 컬럼 생성. 100px 그리고 100%.

두개를 연결하면 최소 크기 보장됨.

다만 두개 머지시켜줘야함..

아이템은 잘나오나 .

헤더는.. 버그가 있음- -

 

그래서 PreRender에서 수정.

protected void rgClnCenter_PreRender(object sender, EventArgs e)
 {

 #region // 렌더링시 체크
  if (sender is RadGrid)
  {
   try
   {
    var vrMtv = ((RadGrid)sender).MasterTableView.Items;

    foreach (var vrIn in vrMtv)
    {
     string strV = vrIn.GetType().ToString();

     if (vrIn is GridDataItem)
     {
      ((GridDataItem)vrIn)["DeptNmCom"].ColumnSpan = 2;
      ((GridDataItem)vrIn)["DeptNmSpan"].Visible = false;
     }
    }
   }
   catch
   { }
  }

GridItem[] groupHeaders = ((RadGrid)sender).MasterTableView.GetItems(GridItemType.Header);

  //헤더중 첫줄만 적용. 헤더가 멀티로 2줄입니다. 1줄일경우 RowSpan 사용안하심 됩니다.
  int iRow = 0;
  foreach (GridItem item in groupHeaders)
  {
   GridHeaderItem header = (GridHeaderItem)item;
   try
   {
    if (iRow == 0)
    {
     header["DeptNmCom"].ColumnSpan = 2; //헤더 2개를 머지
     header["DeptNmSpan"].RowSpan = 2; //로 머지 안하면 뒤쪽에 줄이 밀려보여줌. 헤더가 멀티로 2줄이여서 ^^
     header["DeptNmSpan"].Attributes.Add("style", "display:none;"); //화면에서 보이지 않도록 스타일 줌.. Visible주면 깨져 보임. --
    }
    iRow++;
   }
   catch
   {}
  }

#endregion
 }

 적용전 ..  윈도우 익스플로러 최소 일경우 "진료과"가 안보임

 

적용후 ... 윈도우 익스플로러 최소 일경우도 "진료과"가 보임

최대로 늘릴경우 크기가 늘어남.

 

 

 

 

 

Posted by 말없제이
,

<telerik:RadAjaxLoadingPanel
        ID="RadAjaxLoadingPanel1"
        runat="server"
        Overlay="true"
        Transparency="10"
        >
        <div style="position: fixed; top: 0px; left: 0px; z-index: 98; height: 100%; width: 100%; background-color: black; opacity: 0.4; filter: alpha(opacity=40)">
        </div>
        <div style="position: absolute; top:20%; left: 0px; z-index: 99;height: 100%; width: 100%; ">
            <asp:Image ID="LoadImg" runat="server" ImageUrl="../image/hr_edu/loding2.gif" />
        </div> 
    </telerik:RadAjaxLoadingPanel>

Posted by 말없제이
,

<telerik:GridViewDataColumn Header="부서" Width="150" DataMemberBinding="{Binding DptLstNm}" IsReadOnly="True" >
                                <telerik:GridViewDataColumn.CellTemplate>
                                    <DataTemplate>
                                        <Button Name="btnDeptPop" Margin="2,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Center"
                                                Command="{Binding DataContext.ShowAuthDept, RelativeSource = {RelativeSource AncestorType={x:Type telerik:RadGridView}}}"
                                                CommandParameter="{Binding AuthSeq}" >
                                            <StackPanel>
                                                <Image Source="../IMG/Search.GIF" Height="17" />
                                            </StackPanel>
                                        </Button>
                                    </DataTemplate>
                                </telerik:GridViewDataColumn.CellTemplate>
                            </telerik:GridViewDataColumn>

Posted by 말없제이
,

출처 http://akddd.net/188

개인적인 공간...TagMedia LogLocation LogGuest BookAdminWrite 

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

위에 싸이트가 자세히 되어있을겁니다.
갑자기 사라지는것이 많아. 일단 위치저장~~.


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

[C#] UltraWinGrid 및 C# 팁정리
.NET (C#)
2009/03/10 11:27
 
Posted by memorys
[C#] UltraWinGrid 및 C# 팁정리

DataTable에 PrimaryKey설정

DataColumn[] dc = new DataColumn[1];
dc[0] = dt.Columns[0];
dt.PrimaryKey = dc;
dt.AcceptChanges();

-----------------------------------------------------------
DataTable Merge
DataTable dtTemp = dt.Clone();
// PrimaryKey 셋팅(Merge할때 기본키값을 설정하지 않으면 테이블 Merge시 중복된 데이터가 들어갈수 있습니다.
dtTemp.PrimaryKey = new DataColumn[] { dtTemp.Columns[0] };
dtTemp.Merge(dt);

-----------------------------------------------------------
UltraWinGrid Cell에 동적으로 Text변경
// UltraGrid.ActiveCell.Text 가 ReadOnly속성이라 값 셋팅이 안되서 삽질좀 했음 ㅠ
UltraGrid.ActiveCell.SetValue(value, false);

-----------------------------------------------------------
UltraWinGrid에서 변경된값과 변경 전 값 비교
grid.ActiveCell.OriginalValue.Equals(sTmpEmno)

-----------------------------------------------------------
입력된 문자열의 byte수 구하기
Encoding ec = Encoding.GetEncoding("euc-kr");
int iTmp = ec.GetByteCount(grid.ActiveCell.Text);
참고 : Encoding 목록

-----------------------------------------------------------
DataTable에 존재하는 Data중 중복된 값 제거하기

그다지 맘에 들지 않지만.. ㅠ
#region Row, Row를 비교한다.
public static bool RowEqual(object[] Values, object[] OtherValues)
{
    if (Values == null) return false;
    for (int i = 0; i < Values.Length; i++)
    {
        if (!Values[i].Equals(OtherValues[i])) return false;
    }
    return true;
}
#endregion
#region 데이터테이블을 distinct한다.
public static DataTable Distinct(DataTable Table, DataColumn[] Columns)
{
    DataTable dt = null;
    string sort = string.Empty;
    try
    {
        if (Table != null)
        {
            dt = new DataTable("Distinct");
            for (int i = 0; i < Columns.Length; i++)
             {
                dt.Columns.Add(Columns[i].ColumnName, Columns[i].DataType);
                sort += Columns[i].ColumnName + ",";
            }

            object[] currentrow = null;
            object[] previousrow = null;
            DataRow[] sortedrows = Table.Select(string.Empty, sort.Substring(0, sort.Length - 1));
            dt.BeginLoadData();
            foreach (DataRow row in sortedrows)
            {
                currentrow = new object[Columns.Length];
                for (int i = 0; i < Columns.Length; i++)
                {
                    currentrow[i] = row[Columns[i].ColumnName];
                }
                if (!RowEqual(previousrow, currentrow))
                {
                    dt.LoadDataRow(currentrow, true);
                }
                previousrow = new object[Columns.Length];
                for (int i = 0; i < Columns.Length; i++)
                {
                    previousrow[i] = row[Columns[i].ColumnName];
                }
            }
            dt.EndLoadData();
        }
    }
    catch (Exception ex) // 프로그램에서 예상하지 못한 Exception을 처리합니다.
    {
        throw ex;
    }
    finally // 더 이상 사용하지 않는 자원을 해제합니다.
    {
    }
    return dt;
}


테이블 피봇 (세로 -> 가로)

/// <summary>
/// DataTable를 CrossTab 형태로 변환한는 Class
/// </summary>
public class DataTable2CrossTab : DataTable
{
 #region Convert()
 public static DataTable Convert(DataTable Source, DataColumn[] RowColumns, DataColumn ColColumn, DataColumn DataColumn)
 {
  DataTable crossTab = null;
  DataColumn[] dynamiccolumns = null;
  #region UI Layer에서 MessageBox 처리없이, Exception을 처리하는 Block입니다.
  try
  {
   if (Source != null)
   {
    crossTab = new DataTable(String.Format("{0}_CrossTab", Source.TableName));
    // 1. CrossTab의 Rows의 값을 열을 구성한다.
    crossTab.Merge(Distinct(Source, RowColumns));
    // 2. CrossTab의 열을 구성할 Row를 만든다.
    DataTable temp = Distinct(Source, ColColumn);
    dynamiccolumns = new DataColumn[temp.Rows.Count];
    for (int i = 0; i < temp.Rows.Count; i++)
    {
     //crossTab.Columns.Add(temp.Rows[i][ColColumn.ColumnName].ToString(), ColColumn.DataType);
     crossTab.Columns.Add(temp.Rows[i][ColColumn.ColumnName].ToString(), DataColumn.DataType);
     dynamiccolumns[i] = new DataColumn(temp.Rows[i][ColColumn.ColumnName].ToString(), DataColumn.DataType);
    }
    // 3. 데이터를 채운다.
    foreach (DataRow dr in crossTab.Rows)
    {
     string filter = string.Empty;
     for (int i = 0; i < RowColumns.Length; i++)
     {
      if (i == 0)
      {
       if (dr[RowColumns[i].ColumnName].ToString().Length > 0)
       {
        filter += String.Format("{0} = '{1}'", RowColumns[i].ColumnName, dr[RowColumns[i].ColumnName].ToString());
       }
       else
       {
        filter += String.Format("{0} is null", RowColumns[i].ColumnName);
       }
      }
      else
      {
       if (dr[RowColumns[i].ColumnName].ToString().Length > 0)
       {
        filter += String.Format(" and {0} = '{1}'", RowColumns[i].ColumnName, dr[RowColumns[i].ColumnName].ToString());
       }
       else
       {
        filter += String.Format(" and {0} is null", RowColumns[i].ColumnName);
       }
      }
     }
     DataRow[] drs = Source.Select(filter);
     for (int i = 0; i < drs.Length; i++)
     {
      dr[drs[i][ColColumn].ToString()] = drs[i][DataColumn].ToString();
     }
    }
    crossTab.AcceptChanges();
   }
  }
  catch (Exception ex) // 프로그램에서 예상하지 못한 Exception을 처리합니다.
  {
   throw ex;
  }
  finally // 더 이상 사용하지 않는 자원을 해제합니다.
  {
  }
  #endregion
  return crossTab;
 }
 #endregion


테이블 피봇 (가로 -> 세로)

 #region ConvertRow2Col()
 /// <summary>
 /// Row를 Column 으로 Column을 Row로 바꾸는 메소드
 /// </summary>
 /// <param name="Source">DataTable</param>
 /// <param name="StardardColumn">기준컬럼</param>
 /// <param name="DataType">데이터형</param>
 /// <returns></returns>
 public static DataTable ConvertRow2Col(DataTable Source, DataColumn StardardColumn, Type DataType)
 {
  DataTable dtNew = new DataTable();
  // 기준컬럼 만들기
  DataColumn dcCol = new DataColumn(StardardColumn.ColumnName, Type.GetType("System.String"));
  dtNew.Columns.Add(dcCol);
  // 기준컬럼에 해당하는 행을 컬럼으로 변환하기
  DataColumn dcTemp = null;
  foreach (DataRow row in Source.Rows)
  {
   if (StardardColumn.DataType == Type.GetType("System.DateTime"))
   {
    dcTemp = new DataColumn(row[StardardColumn].ToString().Substring(0, 10), DataType);
   }
   else
   {
    dcTemp = new DataColumn(row[StardardColumn].ToString(), DataType);
   }
   dtNew.Columns.Add(dcTemp);
  }
  // 기준 컬럼 Remove
  Source.Columns.Remove(StardardColumn);
  // 컬럼 정보를 행으로 변환
  foreach (DataColumn col in Source.Columns)
  {
   DataRow dr = dtNew.NewRow();
   dr[StardardColumn.ColumnName] = col.ColumnName;
   dtNew.Rows.Add(dr);
  }
  for (int i = 0; i < Source.Columns.Count; i++)
  {
   for (int j = 0; j < Source.Rows.Count; j++)
   {
    dtNew.Rows[i][j+1] = Source.Rows[j][i];
   }
  }
  dtNew.AcceptChanges();
  return dtNew;
 }
 #endregion
Trackback 0 Comment 2
Trackback :: http://akddd.net/trackback/188 
 

Posted by 말없제이
,