2011-03-08 4 views
0

기본적으로 나는 현재 POS 시스템에 사용되는 tablelayoutpanel을 가지고 있습니다. 버튼 컨트롤에서 SetColumnSpan을 호출하면 tablelayoutpanel이 추가 행을 추가하고 화면 레이아웃을 엉망으로 만듭니다..NET TableLayoutPanel

누구도 전에 이것을 경험 했습니까?

패널의 각 여유 공간에 빈 버튼이 지정되며, 화면이 편집 모드에있을 때 버튼을 추가/편집하고 삭제할 수 있습니다. 다음은 버튼 변경 사항을 적용하는 코드입니다.

편집 정리 코드를 조금 여기

void button_MouseUp(object sender, EventArgs e) 
    { 
     try 
     { 
      TableLayoutPanelCellPosition pos = tableLayoutPanel1.GetCellPosition((Control) sender); 
      POSButton productButton = GetProductButton(sender); 

      tableLayoutPanel1.SuspendLayout(); 

      if (productButton == null) 
      { 
       DeleteButton(sender, pos); 
       return; 
      } 

      productButton.Dock = DockStyle.Fill; 

      EditModeHookButton(productButton); 
      tableLayoutPanel1.Controls.Remove((Control) sender); 

      tableLayoutPanel1.Controls.Add(productButton, pos.Column, pos.Row); 

      if (productButton.TableRowSpan > 0) 
       tableLayoutPanel1.SetRowSpan(productButton, productButton.TableRowSpan); 

      if (productButton.TableColumnSpan > 0) 
       tableLayoutPanel1.SetColumnSpan(productButton, productButton.TableColumnSpan); 

      buttonManager.Save(tableLayoutPanel1); 
      tableLayoutPanel1.ResumeLayout(); 
     } 
     catch(OperationCanceledException) 
     { 

     } 
    } 

버튼 레이아웃을 직렬화 버튼 관리자 기능입니다. 여기

public void Save(ScreenTabkeLayoutPanel panel) 
    { 
     List<ButtonSaveInfo> buttons = new List<ButtonSaveInfo>(); 
     foreach (Control control in panel.Controls) 
     { 
      TableLayoutPanelCellPosition pos = panel.GetCellPosition(control); 
      ButtonSaveInfo info; 

      if (control is POSButton) 
       info = ((POSButton)control).ConvertToButtonInfo(pos); 
      else 
       info = control.ConvertToButtonInfo(pos); 

      buttons.Add(info); 
     } 

     AppDataSerializer.SaveBinary(buttons,buttonPath); 
    } 

는 /로드 코드가 버튼 고급의

private void LoadButtonsFromFile(ScreenTabkeLayoutPanel panel) 
    { 
     List<ButtonSaveInfo> buttons = AppDataSerializer.LoadBinary<List<ButtonSaveInfo>>(buttonPath); 
     panel.SuspendLayout(); 
     foreach (ButtonSaveInfo info in buttons) 
     { 
      switch (info.ButtonType) 
      { 
       case (int) ButtonType.PRODUCT: 

        POSButton productButton = info.ConvertToPosButton(); 
        wireButtonEvents(productButton); 
        panel.Controls.Add(productButton, info.ColumnIndex, info.RowIndex); 

        if (productButton.TableRowSpan > 0) 
         panel.SetRowSpan(productButton, productButton.TableRowSpan); 

        if (productButton.TableColumnSpan > 0) 
         panel.SetColumnSpan(productButton, productButton.TableColumnSpan); 


        break; 

       default: 
        Control control = BuildBlankButton(); 
        wireButtonEvents(control); 
        panel.Controls.Add(control, info.ColumnIndex, info.RowIndex); 
        break; 
      } 
     } 
     FillEmptySpacesWillBlankButtons(panel); 
     panel.ResumeLayout(); 
    } 

덕분으로 화면을 채 웁니다입니다.

답변

1

스팬 셀에 컨트롤이 없는지 확인하십시오.

셀 0,0에 열 간격을 2로 설정하고 컨트롤을 1,0로 설정하면 레이아웃 엔진을 혼동하게됩니다. 귀하가 귀하의 질문에 모든 셀에 빈 버튼을 추가 했으므로이 부분에서 일어날 수 있습니다.

스팬하려는 셀에서 컨트롤을 제거했는지 확인하십시오.

또한 테이블 레이아웃이 그냥 포기하는 상황이 있습니다. 특히 자동 크기 조정을 사용하여 셀을 스팬하는 경우가 있습니다.

+0

Coincoin 감사합니다. – Jamie

1

RowSpan을 테이블의 행 수보다 큰 값으로 설정하고 있습니까? 이로 인해 추가 행이 렌더링 될 수 있습니다. 그 외에는 더 많은 정보/코드를 제공해야합니다.

+0

안녕하세요 Kaius는 답장을 보내 주셔서 감사합니다. 행과 열이 많이 없습니다. 코드를 더 추가하겠습니다. – Jamie