使用 SQL DB 表创建下拉菜单 C#

Posted

技术标签:

【中文标题】使用 SQL DB 表创建下拉菜单 C#【英文标题】:Creating DropDown menu C# with SQL DB Tables 【发布时间】:2016-09-12 19:08:45 【问题描述】:

我正在做的事情需要你的帮助。

这很简单,但一直困扰着我。

我正在 WPF 应用程序中创建一个 ComboBox[DropDown Menu],我想用我的数据库中的所有当前表来填充它。

这就是我正在努力做的事情: 当我单击 ComboBox 时,它将显示数据库中的所有可用表。然后,当我单击其中一个时,它将显示包含在我放置在菜单下方的 DataGrid 中的选定表中的信息。

这是我在打开 ComboBox 时使用的代码:

private void tableComboBox_DropDownOpened(object sender, EventArgs e)
    
        SqlCommand cmd = new SqlCommand("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE';", db.connection);

        SqlDataAdapter dataAdapter = new SqlDataAdapter(cmd);
        DataSet dataSet = new DataSet();
        dataAdapter.Fill(dataSet);

        foreach(DataRow row in dataSet.Tables)
        
            tableComboBox.Items.Add(row);
        
    

我已经查看并尝试了一些不同的方法,但它们都不起作用。 我试图在 DataGrid 中显示表格的内容,但我又卡住了。

请各位程序员。在这里帮助这个新手! :)

【问题讨论】:

【参考方案1】:

这就是我很快想到的。

    移除 tableComboBox_DropDownOpened 事件。 添加事件comboBox_SelectionChange 更改您的数据库连接字符串、组合框和数据网格的名称以匹配您的。

这是下面的代码,我将 loadCombo() 移到您的初始化下方以使其简单。

    public partial class MainWindow : Window

SqlConnection db = new SqlConnection("Your Connection String Here");

    public MainWindow()
    
        InitializeComponent();

        loadCombo();
    

    private void loadCombo()
    
        SqlCommand cmd = new SqlCommand("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE';", db);

        SqlDataAdapter dataAdapter = new SqlDataAdapter(cmd);
        DataSet dataSet = new DataSet();
        dataAdapter.Fill(dataSet);

        foreach (DataRow row in dataSet.Tables[0].Rows)
        
            comboBox.Items.Add(row[0]);
        
    

    private DataTable loadDataGrid(String inTableName )
    
        SqlCommand cmd = new SqlCommand("SELECT COLUMN_NAME,* FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '"+ inTableName + "';", db);

        SqlDataAdapter dataAdapter = new SqlDataAdapter(cmd);
        DataSet dataSet = new DataSet();
        dataAdapter.Fill(dataSet);

        return dataSet.Tables[0];
    
    private void comboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    
        string text = e.AddedItems[0].ToString(); ;
        dataGrid.ItemsSource = loadDataGrid(text).DefaultView;
    

希望对你有帮助

我在下面更新了您的代码。将其粘贴到试一试中。我不确定创建按钮发生了什么,但让我们看看我们是否可以修复组合框和数据网格。我在代码中添加了一些 cmets 来帮助解释我的理性。

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace DatabaseManagement

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window

    Database db = new Database();

    public MainWindow()
    
        InitializeComponent();
        // Add the loadCombo back
        loadCombo();
        // comment this out until you get the desired functionality  
        //TableCreateGrid.Visibility = Visibility.Hidden;
    

    private void createButton_Click(object sender, RoutedEventArgs e)
    
        try
        
        // I am not sure what you are doing here -  
            if (string.IsNullOrEmpty(column3TextBox.Text) && string.IsNullOrEmpty(column4TextBox.Text))
            
                db.CreateTable(tableTextBox.Text, column1TextBox.Text, column2TextBox.Text);

                informationBlock.Text = db.infoBoxString;
            

            else if (string.IsNullOrEmpty(column4TextBox.Text))
            
                db.CreateTable(tableTextBox.Text, column1TextBox.Text, column2TextBox.Text, column3TextBox.Text);

                informationBlock.Text = db.infoBoxString;
            

            else if (!string.IsNullOrEmpty(column3TextBox.Text) && !string.IsNullOrEmpty(column4TextBox.Text))
            
                db.CreateTable(tableTextBox.Text, column1TextBox.Text, column2TextBox.Text, column3TextBox.Text, column4TextBox.Text);

                informationBlock.Text = db.infoBoxString;
            
        

        catch (Exception ex)
        
            informationBlock.Text = ex.Message;
        
    

    private void button_Click(object sender, RoutedEventArgs e)
    
        db.Connect();
        informationBlock.Text = db.infoBoxString;
    

    private void button1_Click(object sender, RoutedEventArgs e)
    
        db.Close();
        informationBlock.Text = db.infoBoxString;
    

    private void loadCombo()
    
        SqlCommand cmd = new SqlCommand("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE';", db.connection);

        SqlDataAdapter dataAdapter = new SqlDataAdapter(cmd);
        DataSet dataSet = new DataSet();
        dataAdapter.Fill(dataSet);

        foreach (DataRow row in dataSet.Tables[0].Rows)
        
            tableComboBox.Items.Add(row[0]);
        
    

    private DataTable loadDataGrid(String inTableName)
    
        //  Here you need to specify the columns you want in the TableCreateGrid
        //  example  this just will show the COLUMN NAME,DATA TYPE, CHARACTER MAXIMUM LENGTH and so on
        //  SqlCommand cmd = new SqlCommand("SELECT COLUMN_NAME,DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, TABLE_SCHEMA FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '" + inTableName + "';", db.connection);
        SqlCommand cmd = new SqlCommand("SELECT COLUMN_NAME,* FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '" + inTableName + "';", db.connection);

        SqlDataAdapter dataAdapter = new SqlDataAdapter(cmd);
        DataSet dataSet = new DataSet();
        dataAdapter.Fill(dataSet);

        return dataSet.Tables[0];
    

    private void tableComboBox_DropDownOpened(object sender, EventArgs e)
    
        //loadCombo();
        // dont need since this is loaded on Initialize
    

    private void tableComboBox_DropDownClosed(object sender, EventArgs e)
    
      //  tableComboBox.Items.Clear();
      // dont need since this will clear all the items in the tableComboBox
    

    private void tableComboBox_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
    
        try
        
            string text = e.AddedItems[0].ToString(); ;
            dataGrid.ItemsSource = loadDataGrid(e.AddedItems[0].ToString()).DefaultView;
        

        catch (Exception ex)
        
            informationBlock.Text = ex.Message;
        
    

    

【讨论】:

虽然它在某种程度上起作用,但在我改变了一些东西之后,Doa Ink 仍然存在一个问题。我注意到的第一件事是它没有正确加载数据。这是图像:imgur.com/U8jCFCZ 当我选择一个项目时,ComboBox 进入其默认阶段,没有选择任何项目。是的,它确实在 dataGrid 中显示了表格,但并不像您在下图中看到的那样。我自己尝试了几次更正,但都没有成功。以下是完整代码:codesend.com/view/079261ba7c6be8bb8ceae6debc56d30b 再次感谢您抽出宝贵时间 Doa【参考方案2】:

这是在组合框中存储显示名称和值的代码

 private void Form1_Load(object sender, EventArgs e)
    

        var Header = new BindingList<KeyValuePair<string, string>>();
        List<string> LV = ListHeader();
        foreach (var listOut in LV)
        
            Header.Add(new KeyValuePair<string, string>(listOut, "val"+listOut));
        
        tableComboBox.DataSource = Header;
        tableComboBox.DisplayMember = "Key";
        tableComboBox.ValueMember = "Value";
    


public List<string> ListHeader()

    List<string> list = new List<String>();

    try
    
        cmd.Connection = db.connection;

        cmd.CommandText = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE';";

        var reader = cmd.ExecuteReader();

          for(int i=0;i<reader.FieldCount;i++)
          
            list.Add(reader.GetName(i));
          

        
    
    catch (Exception ex)
    
        MessageBox.Show(ex.Message, "Get Header",
             MessageBoxButtons.OK, MessageBoxIcon.Error);
    
    finally
    
        con.Close();
    

    return list;

你可以像这样得到组合框的值:

Console.WriteLine(((KeyValuePair)tableComboBox.SelectedItem).Value.ToString());

或者您只想获得一个显示名称:

tableComboBox.SelectedItem.ToString()

【讨论】:

以上是关于使用 SQL DB 表创建下拉菜单 C#的主要内容,如果未能解决你的问题,请参考以下文章

C# 动态添加2级下拉菜单问题

如何在sql中创建嵌套表

Bootstrap 中的子菜单下拉布局

asp 2级联动菜单,动态获取2级下拉列表,2级列表来自两个表,求该,问起解决再加100分

C# menustrip下拉菜单自动收回问题

c# 高手来帮帮忙ComboBox下拉菜单的问题