在另一个类

时间:2016-02-05 02:03:11

标签: c# sql windows-forms-designer

所以我编写了一个连接数据库的程序,一切都很好。但是,我想在按下时添加一个按钮,弹出另一个表单,其中包含连接到的DB的表和列。我已经在传递中完成了这个操作,从文件路径读取并拉出文件夹和内部的东西,但由于某种原因我不能复制它。

当我在过去做的时候,我不得不创建一个新表单,显然是form.cs但是我必须创建另一个类来进行解析。我想我必须做同样的事情,创建一个执行sql查询的类,然后在form.cs里面的列表框中显示它。但是,我遇到的一个问题是从我的form1.cs读取连接字符串,所以我可以使用该连接字符串运行查询。任何帮助/指导将不胜感激。请记住,我对C#很新,并在其中使用sql语句。

这是我现在的小代码

按钮单击我的form1.cs

 private void Btn_Click(object sender, EventArgs e)
        {
            var Fun = new DBTableColSearch();

            var DBLocation = Fun.searchMyDataBase();

        }

单独的课程

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;

namespace SQLTool
{
    public class DBTableColSearch
    {


        public string TableName { get; set; }
        public string ColName { get; set; }
        public static SqlConnection myConnection = null; 




        public string searchMyDataBase()


          {
                using (SqlConnection myConnection = new SqlConnection(DBConnectionBox.Text))   
            }
something.ShowDialog();

            return something.userDBLocations;

            }
    }
}

Form.cs类

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SQLTool
{
    public partial class DBSearch : Form
    {
        private DBTableColSearch[] _DBLocations;
        public string userDBlocation;

        public DBSearch(DBTableColSearch[] DBLocations)
        {
            InitializeComponent();
            _DBLocations = DBLocations;
            TableLB.Items.AddRange(_DBLocations.Select(x => x.TableName).Distinct().ToArray());
        }

        private void TableLB_SelectedIndexChange(object sender, EventArgs e)
        {
            ColumnLB.Items.Clear();
            ColumnLB.Items.AddRange(_DBLocations.Where(x => x.TableName == TableLB.SelectedItem.ToString()).ToArray());
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我理解的方法是将连接字符串值从一个类(表单)传递给另一个类(表单)时出现问题...

良好做法的一部分是定义字符串值,以后可能会在应用程序中将其置于配置文件中。 (使事情易于管理)

在你的App.config上:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <appSettings>
    <add key="myCon" value="the connection string"/>
  </appSettings>
</configuration>

我定义了一个名为“myCon”的键,其值为“连接字符串” 因此,在您的应用程序中,您可以像这样访问myCon:

string connectionString = ConfigurationSettings.AppSettings["myCon"];

如果有警告声明它已过时,请改用:

string connectionString = ConfigurationManager.AppSettings["myCon"];

请注意,这使用System.Configuration命名空间,因此将其添加到using语句中。

这样做的好处是,您不必更改整个代码,以便更新连接字符串,并且几乎可以在项目的任何位置访问它。

更新:

由于您提到从用户输入获取连接字符串值,您可以通过多种方式将对象传递给其他类...

1)使用构造函数(即使它是一种SqlConnection,也可以传递任何对象):

public class Form2 : Form
{
    private string _connection;

    public Form2(string connection)
    {
       _connection = connection; 
    }
}

在Form1 btn点击事件:

Form2 frm2 = new Form2(DBLocation); // var DBLocation = Fun.searchMyDataBase();
frm2.ShowDialog();

2)公共财产

public class Form2 : Form
{
    public string _connection { get; set; }

    public Form2()
    {
    }
}

在Form1 btn点击事件:

Form2 frm2 = new Form2(); 
var DBLocation = Fun.searchMyDataBase();
frm2._connection = DBLocation;
frm2.ShowDialog();

还有其他方法,但这些例子应该足够了。