【问题标题】:Need to set datagridview datasource with a binding source需要用绑定源设置datagridview数据源
【发布时间】:2020-09-13 14:25:31
【问题描述】:

我正在使用高级数据网格视图,要使用它附带的过滤器,您需要使用绑定源。我正在编写一个 Oracle 查询(实际上是其中的几个)并将结果用作数据源。我似乎无法让它正常工作。我用谷歌搜索了所有解决方案,并尝试了所有方法,但均未成功。

我的代码:

 public partial class frmMain : Form
{
    private string sql;
    public DataGridView DVG = new DataGridView();
    public BindingSource bs = new BindingSource();     
    private static string connectionString = "User Id=;Password=;" +
            "Data Source=:1521/;Pooling=false;";

    private void cmdtb1pg1_Click(object sender, EventArgs e)
    {
        // Get Analysis
        sql = "SELECT DISTINCT NAME FROM LWPROD.ANALYSIS ORDER BY 1";                
        bs.DataSource = GetData(sql, dgAnalysis);    
        dgAnalysis.ClearSelection();            
    }

    private BindingSource GetData(string sql, DataGridView DGV)
    {
        DataTable table = new DataTable();
        OracleConnection con = new OracleConnection(connectionString);
        BindingSource bs = new BindingSource();
        try
        {                         
            DataSet ds = new DataSet();
            OracleCommand cmd = new OracleCommand();
            con.Open();
            OracleDataAdapter da = new OracleDataAdapter();                
            da.Fill(ds, connectionString);
            bs.DataSource = da;
            return bs;
        }
        catch
        {
            return bs;
        }
        finally
        {
            var name = DGV.Name;
            switch (name)
            {
                case "dgAnalysis":
                    dgAnalysis.DataSource = bs; 
                    break;
                case "dgComponents":
                    dgComponents.DataSource = bs;   
                    break;                        
            }           
        }            
    }      

【问题讨论】:

  • 您是否尝试调试 finally 块中发生的事情?你确定这些名字吗?
  • GetData 还返回一个 BindingSource(在任何地方都使用相同的全局变量),因此您不必将 BindingSource 分配给同一 BindingSource 的 DataSource。无需从 GetData 分配返回
  • Steve 此代码 private BindingSource GetData(string sql, DataGridView DGV) 需要返回。我将如何改变它?
  • 史蒂夫 - 是的,我很确定名字。
  • bs = GetData(sql, dgAnalysis); 但这是不必要的,因为 bs 已在 GetData 中设置。当然在修复@JQSOFT 指出的错误之后

标签: c# sql oracle datagridview datasource


【解决方案1】:

这是一些更新的代码。这仍然行不通。在这次尝试中。

1.    ` bs.DataSource = GetData(sql, dgAnalysis);` is stating that cannot implicitly convert type void to object.

2.     ` bs = new BindingSource(ds, DGV); ` is stating that Argument 2 cannot convert from ADGV,AdvancedDataGridView to string. DGV is a variable that contains the name of the datagridview being worked with. See 1. it's working with dgAnalysis, later it's working with dgComponents. I have multiple other datagridview to fill.


private void cmdtb1pg1_Click(object sender, EventArgs e)
    {
        // Get Analysis
        sql = "SELECT DISTINCT NAME FROM LWPROD.ANALYSIS ORDER BY 1";                
        bs.DataSource = GetData(sql, dgAnalysis);    
        dgAnalysis.ClearSelection();            
    }       



    private  void GetData(string sql, AdvancedDataGridView DGV)
    {       
        OracleConnection con = new OracleConnection(connectionString);           
        OracleDataAdapter table = new OracleDataAdapter();
        try
        {
            DataSet ds = new DataSet();
            OracleCommand cmd = new OracleCommand();
            con.Open();
            OracleDataAdapter da = new OracleDataAdapter();
            bs = new BindingSource(ds, DGV);              
        }
        catch
        {                
        }
        finally
        {
            var name = DGV.Name;
            switch (name)
            {
                case "dgAnalysis":
                    dgAnalysis.DataSource = bs; 
                    break;
                case "dgComponents":
                    dgComponents.DataSource = bs;   
                    break;                        
            }           
        }            
    }      `

【讨论】:

  • DGVDataGridView 而不是 DataTable 好友。现在将bs = new BindingSource(ds, DGV); 替换为bs = new BindingSource(ds, ds.Tables[0].TableName); 并尝试。
  • JQSOFT - 我正在尝试,但我的新代码无法正常工作,只是在 datagridview 中返回空白行。
【解决方案2】:

我已经完成了其中的一部分工作,我可以将值输入 dgAnalysis,过滤它们并将其用作第二个查询的参数。运行第二个查询后,第一个数据 gridview 将包含 3 列而不是 1 列。第二个数据网格视图将包含 3 行而不是 2 行,并且查询的解析没有填充第二个查询。

拳头跑: First run

第二次运行: Second run

这是更新后的代码:

using System;
using System.Data;
using System.Windows.Forms;
using Oracle.ManagedDataAccess.Client;
using ADGV;

namespace Stored_Query_3
{
public partial class frmMain : Form
{
    private string sql;
    private static string namedgAnalysis;
    private string namedgComponents;
    //private string name;
    //private string name;
    public AdvancedDataGridView DVG = new AdvancedDataGridView();
    private string DVGcomponent;
    BindingSource bs;
    DataTable dt = new DataTable();       
    private static string connString = ";Password=;" +
           "Data Source=:1521/;Pooling=false;";

    public frmMain()
    {
        InitializeComponent();
    }      
    private void componentsByAnalysisToolStripMenuItem_Click(object sender,                 EventArgs e)
    {
        //select correct tab
        var caseSwitch = (sender as ToolStripMenuItem).Text;
        switch (caseSwitch)
        {
            case "Components By Analysis":
                //switch to tab
                this.tab1.SelectedTab = this.tabpg1;
                break;
            default:
                //nothing    
                break;
        }
    }
    private void cmdtb1pg1_Click(object sender, EventArgs e)
    {
        bs.Clear();
        // Get Analysis
        sql = "SELECT DISTINCT NAME FROM LWPROD.ANALYSIS ORDER BY 1";
        bs.DataSource = typeof(AdvancedDataGridView);
        GetData(sql, "namedgAnalysis", dgAnalysis);
        dgAnalysis.ClearSelection();            
    }    
    private void dgAnalysis_FilterStringChanged(object sender, EventArgs e)
    {
        this.bs.Filter = this.dgAnalysis.FilterString;
    }
    private void dgAnalysis_SortStringChanged(object sender, EventArgs e)
    {
        this.bs.Sort = this.dgAnalysis.SortString;
    }        
    private void dgAnalysis_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        try
        {
            if (dgAnalysis.Rows[e.RowIndex].Cells[e.ColumnIndex].Value != null)
            {          
                //Add to listbox
                    lstAnalysis.Items.Add(dgAnalysis.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString());
            }
        }
        catch
        {               
        }      
    }
    private void cmdDeleteFromList_Click(object sender, EventArgs e)
    {
        while (lstAnalysis.SelectedItems.Count > 0)
        {
            lstAnalysis.Items.Remove(lstAnalysis.SelectedItems[0]);
        }
    }
    private void cmd2tb1pg1_Click(object sender, EventArgs e)
    {
        string ana = "";
        foreach (string item in lstAnalysis.Items)
        {
            ana += "'" + item.ToString() + "',";
        }
        //Clean up list itens
        ana = ana.Remove(ana.Length - 1, 1);
        sql = "";
        sql = sql + "SELECT DISTINCT LWPROD.COMPONENT.NAME AS Component_Name,";
        sql = sql + " LWPROD.ANALYSIS.NAME AS Analysis_Name";
        sql = sql + " FROM LWPROD.COMPONENT";
        sql = sql + " INNER JOIN LWPROD.ANALYSIS ON ANALYSIS.NAME = COMPONENT.ANALYSIS";
        sql = sql + " WHERE ANALYSIS.NAME IN (" +  ana + ")";
        sql = sql + " ORDER BY ANALYSIS.NAME,COMPONENT.NAME";

        bs.DataSource = typeof(AdvancedDataGridView);
        GetData(sql, "namedgComponents", dgComponents);
        dgComponents.ScrollBars = ScrollBars.Both;
        dgComponents.ClearSelection();
    }        
    private void GetData(string sql, string name, AdvancedDataGridView Name)
    {
        //clear up string name
        name = name.Remove(0, 4);
        name = name.Trim();

        try
        {
            //oracle connection object
            using (OracleConnection conn = new OracleConnection(connString))
            {
                //retrieve the SQL Server instance version
                sql = sql;  // "SELECT DISTINCT NAME FROM LWPROD.ANALYSIS ORDER BY 1";

                OracleCommand cmd = new OracleCommand(sql, conn);

                //Set the SqlDataAdapter object
                OracleDataAdapter dAdapter = new OracleDataAdapter(cmd);

                //fill dataset with query results
                dAdapter.Fill(dt);
                bs.DataSource = dt;

                //close connection
                conn.Close();
            }
        }
        catch (Exception ex)
        {
            //display error message
            MessageBox.Show("Exception: " + ex.Message);
        }
        finally
        {
            switch (name)
            {
                case "dgAnalysis":
                    //set DataGridView control to read-only
                    dgAnalysis.ReadOnly = true;
                    //set the DataGridView control's data source/data table
                    dgAnalysis.DataSource = bs;
                    break;
                case "dgComponents":
                    //set DataGridView control to read-only
                    dgComponents.ReadOnly = true;
                    //set the DataGridView control's data source/data table
                    dgComponents.DataSource = bs;
                    break;                 
                default:
                    MessageBox.Show("Something Went Wrong");
                    break;
            }               
        }
    }
  }
}

我不确定如何清除 binsindsources 和 datagrids?我试过了:清除bindingsource并重置datagridview的数据源。

【讨论】:

  • 我不知道该怎么办,已经尝试了 3 天。猜猜我会放弃高级的datagridview,看看我是否可以让它与常规的datagridview一起工作。 :(
猜你喜欢
  • 2011-10-29
  • 2014-01-14
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 2011-03-12
  • 2014-09-15
  • 2019-03-14
  • 2015-12-02
相关资源
最近更新 更多