0

晚上好,

我现在在我的项目中有几个窗口。第一个是标准登录窗口。此窗口指定在 SQL Server 上登录的服务器名称、用户名和密码。如果输入正确,您将被连接并路由到下一个窗口。这完美无缺。

在第二个窗口中,有一个 ListBox,其中包含来自已登录服务器的现有数据库列表和一个 ListView,它显示所选(来自列表框)数据库的表。这也有效

它之所以有效,是因为我在代码中手动输入了 SQLConnection 数据。所以:

SqlConnection con = new SqlConnection("Server=servername;User Id=username;Password=password;");

现在如何将先前输入的登录数据获取到第二个窗口中,以便我可以使用它们显示登录服务器中的数据库?

在登录窗口中,很容易使用“Server = listboxservername.Text”等输入的数据,但我不能在第二个屏幕中使用。代码:

public const string CONSTRING = "Server={0};User Id={1};Password={2};";
SqlConnection con = new SqlConnection(String.Format(CONSTRING, txtbServer.Text, txtbUsername.Text, txtbPassword.Password));

现在如何将之前输入的数据放入第二个窗口以便能够继续使用它们?

感谢您的支持!

戴夫

(请原谅我糟糕的 IT 英语)

4

2 回答 2

1

这听起来就像您正在编写一个紧密耦合的应用程序,而您的窗口包含所有数据。这是一种在 WinForms 中很常见的模式,但在 WPF 中已经超越了通常称为MVVM或 Model-View-ViewModel 的 MVC 模式。

这给您带来的最大优势是允许在不同视图之间共享您的数据,无论这些视图是窗口还是控件。因此,在您的情况下,您将创建一个对象来保存所有数据,让我们调用它MyModel,然后与您的两个窗口共享它。

然而,这只是 MVVM 的前半部分。通常除了模型之外,您还定义了一个 ViewModel 类,它将数据转换为您的 UI 可直接使用的表单,并使用INotifyPropertyChanged或继承自该表单的基类。最后,视图通过绑定到它并侦听属性更改来从 VM 中获取数据,以便它可以更新。

所以把它们放在一起你可能会有类似的东西

public class MyModel
{
  public string User {get;set;}
  public SqlConnection Connection {get;set;}
}

public class ViewModel : INotifyPropertyChanged
{
  private MyModel _model = new MyModel();

  public string Server
  {
    get { return _model.Connection.DataSource; }
    set 
    { 
      _model.Connection.DataSource= value;
      OnPropertyChanged("Server");
    }
  }

  public string User 
  {
    get { return _model.User; }
    set 
    { 
      _model.User = value;
      OnPropertyChanged("User");
    }
  }

  public string Password
  {
    set { _model.Connection.Credential = new Credential(_model.user, value); }
  }

 // Syntax varies depending on which MVVM library you are using
 public XXXXCommand ConnectCommand 
 { 
   get 
   { 
     return new XXXXCommand(
       canExecute => !Connection.IsConnected,
       () => Connection.Connect()
    );
  }
}

在你的窗口

<TextBox x:Name="txtbServer" Text="{Binding Server}"/>
<TextBox Text="{Binding User}"/>
<TextBox Text="{Binding Password, Mode=OneWayToSource}"/> <!--Although you would really use a PasswordBox here-->    
<Button Content="Connect" Command="{Binding ConnectCommand}"/>

最后,通过设置窗口的..将View和链接在一起ViewModelDataContext

 var w = new MainWindow();
 w.DataContext = myViewModel;
 w.Show();

祝你好运。

于 2013-11-13T08:25:30.570 回答
0
  1. 请注意,将密码存储在未加密的意思中是不好的,将它们完全存储在您的应用程序中。您应该得到密码,将其 ASASP 传递给服务器并忘记它。那么您应该将连接封装在某个对象中并传递它。

  2. 也就是说,最简单的方法是通过构造函数到下一个窗口。

于 2013-11-12T17:48:00.613 回答