表格布局面板中的中心复选框

时间:2013-08-05 19:53:45

标签: c# .net winforms checkbox tablelayout

我正试图将我的复选框放在TableLayoutPanel中,但由于复选框控件的性质,它们总是最终向左看。见下图:

Table Layout Picture

我希望每行检查都是左对齐的,但要使它更加居中。如下所示:

Table Layout Centered

我已经在网上查了一下,我可以通过设置AnchorStyles.None而不是我想要的中心复选框,因为那时复选框没有对齐。我将它们设置为Dock.Fill,以便您可以单击单元格中的任意位置以激活复选框。

我目前正在填充我的桌子以达到类似的效果,但到目前为止,它不是长期可接受的解决方案。此外,填充单元格将打破复选框文本,而不占用行上的所有可用空间(因为某些行正在被填充吃掉)。在表格的左侧使用间隔单元也是如此,这不是理想的解决方案。

有没有人有任何想法?谢谢!

2 个答案:

答案 0 :(得分:1)

这可能对您有用:

  1. ColumnStyles的所有TableLayoutPanel设为.SizeType = SizeType.AutoSize

  2. 设置TableLayoutPanel.AutoSize = trueTableLayoutPanel.AutoSizeMode = AutoSizeMode.GrowAndShrink;

  3. 添加此代码以动态设置您的复选框(以及TableLayoutPanel):

    //SizeChanged event handler of your tableLayoutPanel1
    private void tableLayoutPanel1_SizeChanged(object sender, EventArgs e){
       //We just care about the horizontal position
       tableLayoutPanel1.Left = (tableLayoutPanel1.Parent.Width - tableLayoutPanel1.Width)/2;
       //you can adjust the vertical position if you need.
    }
    
  4. 更新

    至于你提出的问题,我认为我们必须改变一些事情:

    1. CheckBox AutoSize设为false。之前的解决方案要求它为true

    2. 添加更多代码(在上面的代码旁边):

       int checkWidth = CheckBoxRenderer.GetGlyphSize(yourCheckBox.CreateGraphics(),System.Windows.Forms.VisualStyles.CheckBoxState.MixedNormal).Width;
       //TextChanged event handler of your CheckBoxes (used for all the checkBoxes)
       private void checkBoxes_TextChanged(object sender, EventArgs e){
         UpdateCheckBoxSize((CheckBox)sender);
       }
       //method to update the size of CheckBox, the size is changed when the CheckBox's Font is bolded and AutoSize = true.
       //However we set AutoSize = false and we have to make the CheckBox wide enough
       //to contain the bold version of its Text.
       private void UpdateCheckBoxSize(CheckBox c){
          c.Width = TextRenderer.MeasureText(c.Text, new Font(c.Font, FontStyle.Bold)).Width + 2 * checkWidth;
       }
       //initially, you have to call UpdateCheckBoxSize
       //this code can be placed in the form constructor
       foreach(CheckBox c in tableLayoutPanel1.Controls.OfType<CheckBox>())
          UpdateCheckBoxSize(c);
      
       //add this to make your CheckBoxes centered even when the form containing tableLayoutPanel1 resizes
       //This can also be placed in the form constructor
       tableLayoutPanel1.Parent.SizeChanged += (s,e) => {
          tableLayoutPanel1.Left = (tableLayoutPanel1.Parent.Width - tableLayoutPanel1.Width)/2;
       };
      

答案 1 :(得分:0)

不是在单元格中设置复选框,而是将每个复选框都放在一个组框内,这样就可以让复选框填充每个面板并在它们周围有一个可点击区域。然后将groupbox dock设置为fill并将面板的锚点设置为top,bottom,它们都保持居中。