Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF-如何从另一个/或第一个窗口获取数据_C#_Wpf - Fatal编程技术网

C# WPF-如何从另一个/或第一个窗口获取数据

C# WPF-如何从另一个/或第一个窗口获取数据,c#,wpf,C#,Wpf,晚上好, 我现在在我的项目中有几个窗口。第一个是标准登录窗口。此窗口指定SQL server上登录的服务器名、用户名和密码。如果输入正确,您将被连接并路由到下一个窗口。这是完美的 在第二个窗口中,有一个列表框,其中包含登录服务器中现有数据库的列表,以及一个显示所选(来自列表框)数据库的表的列表视图。这同样有效 但是 它之所以有效,是因为我在代码中手动输入了SQLConnection数据。因此: SqlConnection con = new SqlConnection("Server=serve

晚上好,

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

在第二个窗口中,有一个列表框,其中包含登录服务器中现有数据库的列表,以及一个显示所选(来自列表框)数据库的表的列表视图。这同样有效

但是

它之所以有效,是因为我在代码中手动输入了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));
现在,如何将先前输入的数据输入到第二个窗口中,以便能够继续使用它们

谢谢你的支持

Dave

(请原谅我的IT英语不好)

  • 请注意,以未加密的方式存储密码\n在应用程序中存储密码是不好的。您应该获取密码,将其作为SP传递给服务器,然后忘记它。然后,您应该将连接封装在某个对象中并传递它

  • 也就是说,最简单的方法是通过构造函数进入下一个窗口


  • 这听起来像是在编写一个紧密耦合的应用程序,其中windows保存了所有数据。这是一种在WinForms中很常见的模式,但在WPF中,MVC模式(通常称为模型-视图-视图-模型)已被超越

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

    然而,这只是MVVM的前半部分。通常,除了模型之外,还定义一个ViewModel类,该类将数据转换为用户界面直接可用的表单,并使用
    INotifyPropertyChanged
    或从该类继承的基类。最后,视图通过绑定到VM并侦听属性更改来从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}"/>
    

    祝你好运。

    在用WPF编写一行代码之前先学习MVVM。说真的。在新版本中,你在ctor中传递信息。我想把所有这些代码块都写进业务逻辑中?!所以我有一个类sqlconnection等,它只是供私人使用和练习C#,SQL和WPF。因为我现在正在做学徒,我只是想习惯wpf和sql的结合。
     var w = new MainWindow();
     w.DataContext = myViewModel;
     w.Show();