seb*_*bsn 23 .net c# tablelayoutpanel
我有TableLayoutPanel,我以编程方式添加Rows.用户基本上选择了一个属性,然后将其与一些控件一起显示在表中.我想我在这里有一个普遍的理解问题,我会尝试解释它.
每行中的一个控件是"删除"按钮.该按钮应该删除它所在的行.我所做的是向按钮添加一个事件处理程序并设置当前的rowcount.
deleteTalent.Click += (sender, e) => buttonClickHandler(numberOfRows);
Run Code Online (Sandbox Code Playgroud)
处理程序代码:
private void buttonClickHandler(int rowCount)
{
int count = rowCount - 1;
for (int i = count; i < (count + 5); i++)
{
balanceTable.Controls.RemoveAt(count);
}
balanceTable.RowStyles.RemoveAt(count);
balanceTable.RowCount--;
}
Run Code Online (Sandbox Code Playgroud)
我看了好几个小时,玩了一下.但我找不到一个干净利落的解决方案.我也是C#的新手
这是创建新行的完整函数:
private void addBalanceItems(ToolStripMenuItem item)
{
int numberOfRows = balanceTable.RowCount;
if (numberOfRows > 1)
{
balanceTable.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.AutoSize));
}
balanceTable.Height = numberOfRows * 45;
Steigerungsrechner rechner = new Steigerungsrechner();
string tag = item.Tag.ToString();
//change that asap :(
if (tag == "A") { rechner.column = 1; }
if (tag == "B") { rechner.column = 2; }
if (tag == "C") { rechner.column = 3; }
if (tag == "D") { rechner.column = 4; }
if (tag == "E") { rechner.column = 5; }
if (tag == "F") { rechner.column = 6; }
if (tag == "G") { rechner.column = 7; }
if (tag == "H") { rechner.column = 8; }
Label talentName = new Label();
talentName.Text = item.Text;
talentName.Height = standardHeight;
talentName.TextAlign = ContentAlignment.MiddleLeft;
talentName.AutoSize = true;
Label cost = new Label();
cost.TextChanged += (sender, e) => costChangeHandler(cost);
cost.Height = standardHeight;
cost.TextAlign = ContentAlignment.MiddleLeft;
TextBox startValue = new TextBox();
startValue.TextChanged += (sender, e) => startValueChangeHandler(rechner, startValue, cost);
startValue.Height = standardHeight;
startValue.TextAlign = HorizontalAlignment.Center;
TextBox endValue = new TextBox();
endValue.TextChanged += (sender, e) => endValueChangeHandler(rechner, endValue, cost);
endValue.Height = standardHeight;
endValue.TextAlign = HorizontalAlignment.Center;
Button deleteTalent = new Button();
deleteTalent.Text = "x";
deleteTalent.Click += (sender, e) => buttonClickHandler(numberOfRows);
deleteTalent.Height = standardHeight;
balanceTable.Controls.Add(talentName);
balanceTable.Controls.Add(startValue);
balanceTable.Controls.Add(endValue);
balanceTable.Controls.Add(cost);
balanceTable.Controls.Add(deleteTalent);
balanceTable.Visible = true;
balanceTable.RowCount++;
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激!:)
Cod*_*ray 25
是的,从TableLayoutPanel中删除任意行根本不直观.他们真的搞砸了这个设计.
删除行的唯一方法是设置RowCount属性.仅这一点就足够奇怪了; 这个属性确实看起来应该是只读的,每次看到它时,这样做的代码对我来说都是错误的.
但除此之外,这种设计的结果是你不能从中间删除行.重置RowCount属性只会导致行从底部掉落.
解决方法有点笨拙,有多个步骤出错:
RowCount属性的值来删除最后一行.一个快速的谷歌搜索显示有人写了和共享代码声称这样做.它在VB.NET中,但应该很容易翻译成你的母语.
我承认,我已经知道只是将其放置并将RowHeight我希望"删除"的行设置为0.这样,自动调整功能可以为您完成工作.但是,您可能仍希望删除它包含的控件.
Žil*_*nis 16
下面给出了在给定位置移除行的代码.有一点需要提及:我们通过panel.GetControlFromPosition(...)获得的控件必须是可见的,否则它将返回null而不是不可见的控件.
using System.Windows.Forms;
public static class TableLayoutHelper
{
public static void RemoveArbitraryRow(TableLayoutPanel panel, int rowIndex)
{
if (rowIndex >= panel.RowCount)
{
return;
}
// delete all controls of row that we want to delete
for (int i = 0; i < panel.ColumnCount; i++)
{
var control = panel.GetControlFromPosition(i, rowIndex);
panel.Controls.Remove(control);
}
// move up row controls that comes after row we want to remove
for (int i = rowIndex + 1; i < panel.RowCount; i++)
{
for (int j = 0; j < panel.ColumnCount; j++)
{
var control = panel.GetControlFromPosition(j, i);
if (control != null)
{
panel.SetRow(control, i - 1);
}
}
}
var removeStyle = panel.RowCount - 1;
if (panel.RowStyles.Count > removeStyle)
panel.RowStyles.RemoveAt(removeStyle);
panel.RowCount--;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26632 次 |
| 最近记录: |