我正试图将我的复选框放在TableLayoutPanel
中,但由于复选框控件的性质,它们总是最终向左看。见下图:
我希望每行检查都是左对齐的,但要使它更加居中。如下所示:
我已经在网上查了一下,我可以通过设置AnchorStyles.None
而不是我想要的中心复选框,因为那时复选框没有对齐。我将它们设置为Dock.Fill
,以便您可以单击单元格中的任意位置以激活复选框。
我目前正在填充我的桌子以达到类似的效果,但到目前为止,它不是长期可接受的解决方案。此外,填充单元格将打破复选框文本,而不占用行上的所有可用空间(因为某些行正在被填充吃掉)。在表格的左侧使用间隔单元也是如此,这不是理想的解决方案。
有没有人有任何想法?谢谢!
答案 0 :(得分:1)
这可能对您有用:
将ColumnStyles
的所有TableLayoutPanel
设为.SizeType = SizeType.AutoSize
。
设置TableLayoutPanel.AutoSize = true
和TableLayoutPanel.AutoSizeMode = AutoSizeMode.GrowAndShrink
;
添加此代码以动态设置您的复选框(以及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.
}
至于你提出的问题,我认为我们必须改变一些事情:
将CheckBox
AutoSize
设为false。之前的解决方案要求它为true
。
添加更多代码(在上面的代码旁边):
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,它们都保持居中。