プログラムで行を追加するTableLayoutPanelがあります。ユーザーは基本的にプロパティを選択し、それはいくつかのコントロールと共にテーブルに表示されます。私はここで一般的な理解の問題があると思います。それを説明しようと思います。
各行のコントロールの1つは「削除」ボタンです。そのボタンはそれが入っている行を削除するはずです。私がしたことは、イベントハンドラーをボタンに追加して、現在の行数を設定することです。
deleteTalent.Click += (sender, e) => buttonClickHandler(numberOfRows);
ハンドラーのコード:
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--;
}
何時間もそれを見て遊んだ。しかし、私は動作するクリーンなソリューションを見つけることができません。私は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++;
}
どんな助けでも大歓迎です! :)
ええ、TableLayoutPanelから任意の行を削除することはまったく直感的ではありません。彼らは本当にこれでデザインを台無しにしました。
行を削除する唯一の方法は、 RowCount
プロパティを設定することです。これだけでも奇妙です。そのプロパティは確かに読み取り専用である必要があるように見え、これを実行するコードは、それを見るたびに間違って見える。
しかし、それを超えると、この設計の結果として、中央から行を削除できなくなります。 RowCount
プロパティをリセットすると、行が下部から削除されます。
回避策は少し扱いにくく、誤解するための複数の手順があります。
RowCount
プロパティの値をデクリメントして、最後の行を削除します。Googleをすばやく検索すると、誰かが 記述および共有されたコード を意図していることがわかります。それはVB.NETにありますが、ネイティブ言語に 簡単に翻訳 する必要があります。
私はパントして「削除」したい行のRowHeight
を0に設定することで知られていることを認めます。このようにして、自動サイズ調整が機能します。おそらく、まだ含まれているコントロールを削除する必要があります。
以下は、インデックスによって行を削除するのに役立つ静的クラスです。
_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--;
}
}
_
言及すべきことの1つ:panel.GetControlFromPosition(...)
を介して取得するコントロールは可視である必要があります。そうしないと、非表示のコントロールではなくnull
が返されます。
削除完全なテーブル-
tableLayoutPanel1.Controls.Clear();
tableLayoutPanel1.RowStyles.Clear();
Set your Headline of the Table again-
tableLayoutPanel.RowCount = 1;
tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F));
tableLayoutPanel.Controls.Add(new Label() { Text = "MONTH", Font = new Font("Century Gothic", 12, FontStyle.Bold), ForeColor = Color.LightGray }, 0, tableLayoutPanel.RowCount - 1);
tableLayoutPanel.Controls.Add(new Label() { Text = "YEAR", Font = new Font("Century Gothic", 12, FontStyle.Bold), ForeColor = Color.LightGray }, 1, tableLayoutPanel.RowCount - 1);
tableLayoutPanel.Controls.Add(new Label() { Text = "MEASURED WAFERS", Font = new Font("Century Gothic", 12, FontStyle.Bold), ForeColor = Color.LightGray }, 2, tableLayoutPanel.RowCount - 1);
3列-1行
たぶん誰かが私のコードを使用して、適切に機能します...
最初にrowCount
の既存のコントロールを削除します
for(int i = 0; i < panel.ColumnCount; i++){
Control Control = panel.GetControlFromPosition(i, rowCount);
panel.Controls.Remove(Control);
}
次に行を削除します
panel.RowStyles.RemoveAt(rowCount-1);
tablelayoutpanel
の行を完全に削除することはできませんが、回避策があります。
2px
_に設定します(例:tablelayoutpanel1.Rowstyle(index).height=2
)私にとってこれは不思議に働きました、行インデックスに関係なく行は完全に折りたたまれました。