Можно искать файл непосредственно. Например:
>>> f = open("csv.txt")
>>> c = csv.reader(f)
>>> for row in c: print row
['1', '2', '3']
['4', '5', '6']
>>> f.seek(0)
>>> for row in c: print row # again
['1', '2', '3']
['4', '5', '6']
Я обычно комбинирую PointToScreen
и PointToClient
:
Point locationOnForm = control.FindForm().PointToClient(
control.Parent.PointToScreen(control.Location));
Вы можете пройти через родителей, отмечая их положение в их родителях, пока не вы прибыть в форму.
Изменить: Что-то вроде (непроверено):
public Point GetPositionInForm(Control ctrl)
{
Point p = ctrl.Location;
Control parent = ctrl.Parent;
while (! (parent is Form))
{
p.Offset(parent.Location.X, parent.Location.Y);
parent = parent.Parent;
}
return p;
}
Вы можете использовать метод controls PointToScreen
, чтобы получить абсолютное положение относительно экрана.
Вы можете использовать метод Forms PointToScreen
и с помощью элементарных математических вычислений получить позицию элемента управления.
В моем тестировании решения Ганса Кестинга и Фредрика Мерка дали одинаковый ответ. Но:
Я обнаружил интересное несоответствие в ответе, используя методы Раджа Мора и Ханса Кестинга, и подумал, что поделюсь. Спасибо обоим за их помощь; Не могу поверить, что такой метод не встроен в фреймворк.
Обратите внимание, что Радж не писал код, и поэтому моя реализация могла отличаться от того, что он имел в виду.
Разница, которую я обнаружил, заключалась в том, что метод Раджа Мора часто был на два пикселя больше (как по оси X, так и по оси Y), чем метод от Ханса Кестинга. Я еще не определил, почему это происходит. Я почти уверен, что это как-то связано с тем фактом, что, кажется, есть двухпиксельная граница вокруг содержимого формы Windows (например, внутри самых внешних границ формы). В моем тестировании, которое, конечно, не было исчерпывающим, я встречал его только на вложенных элементах управления. Однако не все вложенные элементы управления демонстрируют это. Например, у меня есть TextBox внутри GroupBox, который демонстрирует несоответствие, а Button внутри того же GroupBox - нет. Я не могу объяснить почему.
Обратите внимание, что когда ответы эквивалентны, они считают, что точка (0, 0) находится внутри границы содержимого, о которой я упоминал выше. Поэтому я считаю, что буду считать решения Ханса Кестинга и Фредрика Мёрка правильными, но не думаю, что буду доверять реализованному мной решению Раджа Мора.
Мне также было интересно, какой именно код написал бы Радж Мор, поскольку он дал идею, но не предоставил код. Я не полностью понимал метод PointToScreen (), пока не прочитал этот пост: http://social.msdn.microsoft.com/Forums/en-US/netfxcompact/thread/aa91d4d8-e106-48d1-8e8a- 59579e14f495
Вот мой метод тестирования. Обратите внимание, что «Метод 1», упомянутый в комментариях, немного отличается от метода Ханса Кестинга.
private Point GetLocationRelativeToForm(Control c)
{
// Method 1: walk up the control tree
Point controlLocationRelativeToForm1 = new Point();
Control currentControl = c;
while (currentControl.Parent != null)
{
controlLocationRelativeToForm1.Offset(currentControl.Left, currentControl.Top);
currentControl = currentControl.Parent;
}
// Method 2: determine absolute position on screen of control and form, and calculate difference
Point controlScreenPoint = c.PointToScreen(Point.Empty);
Point formScreenPoint = PointToScreen(Point.Empty);
Point controlLocationRelativeToForm2 = controlScreenPoint - new Size(formScreenPoint);
// Method 3: combine PointToScreen() and PointToClient()
Point locationOnForm = c.FindForm().PointToClient(c.Parent.PointToScreen(c.Location));
// Theoretically they should be the same
Debug.Assert(controlLocationRelativeToForm1 == controlLocationRelativeToForm2);
Debug.Assert(locationOnForm == controlLocationRelativeToForm1);
Debug.Assert(locationOnForm == controlLocationRelativeToForm2);
return controlLocationRelativeToForm1;
}