Вот мое решение (В Ruby)
def spiral(xDim, yDim)
sx = xDim / 2
sy = yDim / 2
cx = cy = 0
direction = distance = 1
yield(cx,cy)
while(cx.abs <= sx || cy.abs <= sy)
distance.times { cx += direction; yield(cx,cy) if(cx.abs <= sx && cy.abs <= sy); }
distance.times { cy += direction; yield(cx,cy) if(cx.abs <= sx && cy.abs <= sy); }
distance += 1
direction *= -1
end
end
spiral(5,3) { |x,y|
print "(#{x},#{y}),"
}
В формах Windows нет понятия переменных сеанса. Что вы можете сделать:
Создайте внутренний класс, содержащий имя пользователя и пароль, а также любые другие переменные и перечисления, необходимые для всего приложения (что-то вроде Common.cs). К ним можно получить доступ через общедоступные свойства в приложении.
Создайте параметризованный конструктор для всех форм и отправляйте имя пользователя и пароль всякий раз, когда вы показываете форму.
public class MyForm : Form
{
private string userName;
private string password;
}
Поскольку формы Windows поддерживают состояние (в отличие от форм без состояния для веб-форм), вы можете просто использовать поле в своем классе формы.
В winforms вы можете использовать переменные, которые доступны другим формам через методы или свойства.
Вы также можете использовать статические переменные .
В следующем примере у вас будет контроллер для каждого окна или группы окон. Контроллеры будут передаваться друг другу в зависимости от того, как им нужно сотрудничать (какими знаниями им нужно поделиться и т. Д.). Важно сохранить состояние вашего приложения в контроллерах и ограничить окна обработкой пользовательского ввода и событий.
// pseudocode, because I do not know WinForms that much
class MainController
{
private Guid securityToken;
public Guid SecurityToken
{
get { return securityToken; }
set { securityToken = value; }
}
}
class LoginWindowController
{
MainController mainController;
LoginWindow loginWindow;
public LoginWindowController(MainController mainController)
{
this.loginWindow = new LoginWindow(this);
this.mainController = mainController;
}
public void Show()
{
loginWindow.IsVisible = true;
}
public void HandleLogin()
{
Guid token =
myobject.Authenticate(loginWindow.Username, loginWindow.Password);
if (token != Guid.Empty)
{
mainController.SecurityToken = token;
}
}
}
В ответ на ваш комментарий к моему первому ответу:
Вы создаете новый экземпляр формы входа. Как это должно иметь ценности. Это форма входа в систему, и поэтому я считаю, что вы закроете ее, когда пользователь введет имя пользователя и пароль и нажмет «ОК» или что-то еще.
Тогда вы не сможете получить значения из формы входа, поскольку она закрыта. . Если вам нужно придерживаться этого подхода, это может быть выход:
Передать текущий экземпляр в следующую форму. Нравится: В форме входа:
NextForm nxt = new NextForm (this);
Конструктор NextForm будет выглядеть так:
public NextForm(LoginForm frm){
// Code here
}
Теперь в NextForm вы можете получить доступ к свойствам через «frm».
На основании одного из ваших ответов мне непонятно, говорите ли вы о веб-приложении или о поддерживающем приложении. Если вы говорите о веб-приложении, вы можете использовать свойства Session для объекта Page.
Он установит такие переменные:
Session["username"] = "Username";
Session["fullname"] = "User's full name";
Затем вы можете получить доступ, например:
lblGreetings.Text = "Hi " + Session["fullname"];
Это то, что вам нужно?
Вам нужно больше думать о области , чем о сеансе; пока объект остается в области видимости, вы сможете извлекать значения из его общедоступных свойств / полей.
В вашем случае имеет смысл хранить данные пользователя в статическом классе:
public static class LoginInfo
{
public static string UserID;
}
Теперь вы можете получить доступ к UserID просто из любого места в вашем коде:
MessageBox.Show(LogInfo.UserID);