c#: Как передать значение переменной класса вместо ссылки
Создаю, значит, lbGridMarkX класса Label
Label lbGridMarkY = new Label(), lbGridMarkX = new Label();
lbGridMarkX.BackColor = Color.Transparent;
lbGridMarkX.Text = "0";
lbGridMarkX.Size = lbGridMarkX.PreferredSize;
lbGridMarkX.Location = panel1.Location;
lbGridMarkX.Top += height;
lbGridMarkX.Left -= lbGridMarkX.Size.Width / 2;
Controls.Add(lbGridMarkX);
lbGridMarkX.BringToFront();
основательно настраиваю его, и хочу создавать ещё почти такие же Label'ы каждые x пикселей:
цикл {
Label New = new Label();
New = lbGridMarkX;
New.Text = (x * (gridUnitsX / gridStep)).ToString();
New.Left += x;
Controls.Add(New);
}
но проблема в том, когда я делаю New = lbGridMarkX;, то вместо значений, новой Label присывивается ссылка. И вместо создания новой Label каждых x пикселей, этот цикл просто передвигает одну и ту же Label.
Как мне скопировать переменную lbGridMarkX, в переменную New? new Label(lbGridMarkX); здесь не работает. Не присваивать же каждое значение по отдельности?
Ответы (2 шт):
Автор решения: Igor
→ Ссылка
private Label AssignCommonLabelProperties(Label lbl) {
lbl.BackColor = Color.Transparent;
...
return lbl;
}
Label lbGridMarkY = AssignCommonLabelProperties(new Label());
Label lbGridMarkX = AssignCommonLabelProperties(new Label());
Автор решения: Blackmeser
→ Ссылка
class LbGridMarkX : Label
{
public static List<LbGridMarkX> LbGridMarkXList = new List<LbGridMarkX>();
public static int Count => LbGridMarkXList.Count;
//
public LbGridMarkX(Control Parent, Point Location, float Value, ushort decimals)
{
this.BackColor = Color.Transparent;
this.Text = Value.ToString("N" + decimals);
this.Size = this.PreferredSize;
this.Top = Location.Y;
this.Left = Location.X - (this.Size.Width / 2);
//
LbGridMarkXList.Add(this);
if (Parent != null) Parent.Controls.Add(this);
this.BringToFront();
}
public static void Clear()
{
for (int i = LbGridMarkXList.Count - 1; i >= 0; i--)
{
if (LbGridMarkXList[i]?.Parent?.Controls.Contains(LbGridMarkXList[i]) ?? false)
LbGridMarkXList[i].Parent.Controls.Remove(LbGridMarkXList[i]);
LbGridMarkXList.RemoveAt(i);
}
}
public static void AddLbGridMarkXGrid(Control Parent, Point StartLocation, float gridUnitsX, float gridStep, ushort decimals)
{
for (int i = 0; i <= gridUnitsX / gridStep; i++)
{
float value = i * gridStep;
Point newlocation = new Point(StartLocation.X + (int)value, StartLocation.Y);
WriteLine(newlocation);
new LbGridMarkX(Parent, newlocation, value, decimals);
}
}
}
Добавление через:
LbGridMarkX.AddLbGridMarkXGrid(panel1, new Point(100, 100), 400, 100, 0);
LbGridMarkX.AddLbGridMarkXGrid(form1, new Point(0, 100), 300, 30.5f, 1); //или так
Очистка через:
LbGridMarkX.Clear();