Проверка того, присутствует ли пользовательский элемент управления в определенной ячейке при щелчке мышью в C#
Как я могу проверить, существует ли usercontrol в ячейке, где пользователь щелкнул. Я создал пользовательский элемент управления Rack.cs
, просто хочу знать, как я могу проверить, что Rack()
присутствует в этом месте или нет?
Если да, то сделай что-нибудь
private void tableLayoutPanel1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
click++;
var pt = new Point(e.X, e.Y);
var colWidths = this.tableLayoutPanel1.GetColumnWidths();
var rowHeights = this.tableLayoutPanel1.GetRowHeights();
//tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Absolute, 150));
//tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 150F));
int col = -1, row = -1;
int offset = 0;
for (int iCol = 0; iCol < this.tableLayoutPanel1.ColumnCount; ++iCol)
{
if (pt.X >= offset && pt.X <= (offset + colWidths[iCol]))
{
col = iCol;
break;
}
offset += colWidths[iCol];
}
offset = 0;
for (int iRow = 0; iRow < this.tableLayoutPanel1.RowCount; ++iRow)
{
if (pt.Y >= offset && pt.Y <= (offset + rowHeights[iRow]))
{
row = iRow;
break;
}
offset += rowHeights[iRow];
}
tableLayoutPanel1.Controls.Add(racking[click], col, row);
racking[click].setposition(row, col);
racking[click].SetChannel(click.ToString());
tableLayoutPanel1.ColumnStyles[col].SizeType = SizeType.AutoSize;
Adapter.insertposition(RackID, row, col, click);
}
else if (e.Button == MouseButtons.Right)
{
int[] colWidths = tableLayoutPanel1.GetColumnWidths();
int[] rowHeights = tableLayoutPanel1.GetRowHeights();
int top = tableLayoutPanel1.Parent.PointToScreen(tableLayoutPanel1.Location).Y;
for (int y = 0; y < rowHeights.Length; ++y)
{
int left = tableLayoutPanel1.Parent.PointToScreen(tableLayoutPanel1.Location).X;
for (int x = 0; x < colWidths.Length; ++x)
{
if (new Rectangle(left, top, colWidths[x], rowHeights[y])
.Contains(MousePosition))
{
Control c = tableLayoutPanel1.GetControlFromPosition(x, y);
if (c != null)
{
MessageBox.Show("Yes");
}
}
left += colWidths[x];
}
top += rowHeights[y];
}
}
}
Теперь я хочу проверить мой элемент управления Rack вместо элемента управления Rectangle, где он присутствует или нет? А мой Rack control представляет собой смесь текстовых полей и кнопки
1 ответ
После просмотра некоторого кода все еще не совсем понятно, что вы делаете (например, что racking
?), но это все равно должно помочь...
TableLayoutPanel
имеет метод, называемый GetControlFromPosition
который получит элемент управления в данной ячейке (столбце и строке), поэтому сначала вы можете получить этот элемент управления следующим образом:
var myCellControl = tableLayoutPanel1.GetControlFromPosition(col, row);
Что вы будете делать дальше, будет зависеть от того, как вы добавляете свои элементы управления. Если вы непосредственно добавляете Rack
контролировать каждую ячейку, тогда вы можете просто проверить это так:
if(myCellControl is Rack)
{
//is Rack control, so do someting
}
в противном случае, если Rack
элемент управления вложен в элемент управления контейнера (например, Panel
), тогда вы должны зациклить дочерние элементы управления и проверить Rack
управления:
bool hasRack = false;
foreach(Control child in myCellControl.Controls)
{
if(child is Rack)
{
//Rack control found
hasRack = true;
break;
}
}
надеюсь, это поможет