【问题标题】:filter combobox value based on another combobox but at runtime combobox 2 is empty根据另一个组合框过滤组合框值,但在运行时组合框 2 为空
【发布时间】:2013-06-18 11:29:48
【问题描述】:

您好,我有 2 个组合框(例如 cb1、cb2),一个有机器组,另一个有机器。 当我选择 cb1 它应该显示总计而不过滤 cb2 但是当我选择 cb2 它应该过滤记录。一切正常但默认文本不会显示在组合框 2 中(如总计或所有机器) 我的问题是,当我选择组合框 1 时显示总数,但组合框 2 为空,它应该显示包含总数/所有机器的文本我尝试了几种方法,但我无法做到。

 private void Form1_Load(object sender, EventArgs e)
        {

        try
        {
            this.dtStartDate.Value = DateTime.Now.AddDays(-3);
            this.dtEndDate.Value = DateTime.Now;
            PopulateGroupList();
            cboMachines.Items.Insert(0, "-ALL MACHINES-");
            cboMachines.SelectedIndex = 0;
            //cboMachines.SelectedText = "Please Select One";
            cboMachineGroup.SelectedText = "Please Select One";
           //this.cboMachineGroup.SelectedIndex = 0;
            PopulateMachineList();


        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        btnShowForDateRange.Enabled = true;
    }


    private void PopulateMachineList()
    {
        cboMachines.Items.Clear();

        string stringSql = "SELECT DISTINCT lfh.OriginalMachineName   " +
        "FROM MachineGroups mg    " +
        "INNER JOIN MachineGroupList mgl   " +
        "ON (mg.GroupID = mgl.GroupID)    " +
        "INNER JOIN LogFileHeader lfh ON (mgl.MachineID = lfh.FKMachineID)   " +
         "WHERE mg.Name=@groupname " +
        "ORDER BY lfh.OriginalMachineName" ;



        DataTable myDatatable = new DataTable();
        SqlConnection myConn = new SqlConnection();
        myConn.ConnectionString = connString;


        SqlCommand myCommand = new SqlCommand();
        myCommand.CommandType = CommandType.Text;
        myCommand.CommandText = stringSql;
        myCommand.Connection = myConn;
        myCommand.Parameters.Add("@groupname", SqlDbType.VarChar).Value = this.cboMachineGroup.Text;
        myConn.Open();

        SqlDataReader reader = myCommand.ExecuteReader();

        if (reader.HasRows)
        {
            while (reader.Read())
            {
                this.cboMachines.Items.Add(reader[0].ToString());
            }
        }

    }

    private void PopulateGroupList()
    {
        string stringSql = "SELECT DISTINCT mg.Name FROM MachineGroups mg ORDER BY Name";
        DataTable myDatatable = new DataTable();
        SqlConnection myConn = new SqlConnection();
        myConn.ConnectionString = connString;

        SqlCommand myCommand = new SqlCommand();
        myCommand.CommandType = CommandType.Text;
        myCommand.CommandText = stringSql;
        myCommand.Connection = myConn;
        myConn.Open();

        SqlDataReader reader = myCommand.ExecuteReader();

        if (reader.HasRows) 
        {
            while (reader.Read())
            {
                this.cboMachineGroup.Items.Add(reader.GetString(0));
            }
        }

    }

    public DataTable GetDataByMachineGroupAndDateRange(string startDate, string endDate, string machineGroupname, string machineID)
    {

        startDate = startDate + " 00:00:00";
        endDate = endDate + " 23:59:59";

        string stringSql = "";
        if (machineID.Length >0) 
        {



            stringSql = "SELECT mg.GroupID, mg.Name,  " +
        "CONVERT(VARCHAR(10),rta.IDdatetime,121) AS date_only, " +
        "CONVERT(VARCHAR(8), rta.IDdatetime, 108) AS time_only, " +
        "rta.TicketPrice, rta.CardAmount, rta.FKTariffID, rta.RegistrationNum, rta.ExpiryDateTime, " +
        "lfh.OriginalMachineName " +
        "FROM MachineGroups mg  " +
        "INNER JOIN MachineGroupList mgl " +
        "ON (mg.GroupID = mgl.GroupID)  " +
        "INNER JOIN LogFileHeader lfh ON (mgl.MachineID = lfh.FKMachineID)  " +
        "INNER JOIN RegistrationTransactionData rta ON (lfh.PKId = rta.FKLogFileHeader) " +
        "WHERE mg.Name=@groupname  AND lfh.OriginalMachineName=@machineid " +
        "AND rta.IDdatetime BETWEEN @startdate AND @enddate " +
        "ORDER BY rta.IDdatetime" ;
        }



        else
        {
            stringSql = "SELECT mg.GroupID, mg.Name,  " +
       "CONVERT(VARCHAR(10),rta.IDdatetime,121) AS date_only, " +
       "CONVERT(VARCHAR(8), rta.IDdatetime, 108) AS time_only, " +
       "rta.TicketPrice, rta.CardAmount, rta.FKTariffID, rta.RegistrationNum, rta.ExpiryDateTime, " +
       "lfh.OriginalMachineName " +
       "FROM MachineGroups mg  " +
       "INNER JOIN MachineGroupList mgl " +
       "ON (mg.GroupID = mgl.GroupID)  " +
       "INNER JOIN LogFileHeader lfh ON (mgl.MachineID = lfh.FKMachineID)  " +
       "INNER JOIN RegistrationTransactionData rta ON (lfh.PKId = rta.FKLogFileHeader) " +
       "WHERE mg.Name=@groupname " +
       "AND rta.IDdatetime BETWEEN @startdate AND @enddate " +
       "ORDER BY rta.IDdatetime";
        }


        DataTable myDatatable = new DataTable();
        SqlConnection myConn = new SqlConnection();
        myConn.ConnectionString = connString;

        SqlCommand myCommand = new SqlCommand();
        myCommand.CommandType = CommandType.Text;
        myCommand.CommandText = stringSql;
        myCommand.Connection = myConn;

        SqlDataAdapter myAdapter = new SqlDataAdapter();
        myAdapter.SelectCommand = myCommand;

        myCommand.Parameters.Add("@groupname", SqlDbType.VarChar).Value = machineGroupname;
        if (machineID.Length > 0)
        {
            myCommand.Parameters.Add("@machineid", SqlDbType.VarChar).Value = machineID;

        }
        myCommand.Parameters.Add("@startdate", SqlDbType.DateTime).Value = startDate;
        myCommand.Parameters.Add("@enddate", SqlDbType.DateTime).Value = endDate;


        myAdapter.Fill(myDatatable);

        return myDatatable;
    }

    private void btnShowForDateRange_Click(object sender, EventArgs e)
    {

        tblDateRange = new DataTable();
        this.btnShowForDateRange.Enabled = false;
        this.btnFindVRM.Enabled = false;
        this.progressBar1.Visible = true;
        btnExport.Enabled = false;
        this.cboMachines.SelectedText = "ALL Machines";
        string[] parameters = { dtStartDate.Value.ToString("yyyy-MM-dd"), dtEndDate.Value.ToString("yyyy-MM-dd"), this.cboMachineGroup.Text, this.cboMachines.Text  };
        this.backgroundWorker1.RunWorkerAsync(parameters);

    }

    private void btnQuit_Click(object sender, EventArgs e)
    {
        Application.Exit();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        string[] parameters = (string[])e.Argument;
        tblDateRange = GetDataByMachineGroupAndDateRange(parameters[0], parameters[1], parameters[2], parameters[3]);  
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        this.dataGridView1.DataSource = tblDateRange;
        this.btnShowForDateRange.Enabled = true;
        this.btnFindVRM.Enabled = true;
        this.progressBar1.Visible = false;
        this.lblCount.Visible = true;
        this.lblCount.Text = "Count: " + tblDateRange.Rows.Count.ToString();
        tblVRM = new DataTable();
        btnExport.Enabled = true;
    }

    private void cboMachineGroup_SelectedIndexChanged(object sender, EventArgs e)
    {
        //this.cboMachines.Text = "";

        PopulateMachineList();
    }

    private void cboMachines_SelectedIndexChanged(object sender, EventArgs e)
    {

    }

    private void btnFindVRM_Click(object sender, EventArgs e)
    {
        tblVRM = new DataTable();
        this.btnShowForDateRange.Enabled = false;
        this.btnFindVRM.Enabled = false;
        this.progressBar1.Visible = true;
        btnExport.Enabled = false;

        string[] parameters = { txtVRM.Text };
        this.backgroundWorker2.RunWorkerAsync(parameters);
    }


    public DataTable GetDataByVRM(string vrm_in)
    {

        string stringSql = "SELECT mg.GroupID, mg.Name,  " +
       "CONVERT(VARCHAR(10),rta.IDdatetime,121) AS date_only, " +
       "CONVERT(VARCHAR(8), rta.IDdatetime, 108) AS time_only, " +
       "rta.TicketPrice, rta.CardAmount, rta.FKTariffID, rta.RegistrationNum, rta.ExpiryDateTime, " +
       "lfh.OriginalMachineName " +
       "FROM MachineGroups mg  " +
       "INNER JOIN MachineGroupList mgl " +
       "ON (mg.GroupID = mgl.GroupID)  " +
       "INNER JOIN LogFileHeader lfh ON (mgl.MachineID = lfh.FKMachineID)  " +
       "INNER JOIN RegistrationTransactionData rta ON (lfh.PKId = rta.FKLogFileHeader) " +
       "WHERE rta.RegistrationNum=@vrm AND mg.Name NOT IN ('Mains','ALL','ANPR') " +
       "ORDER BY rta.IDdatetime";

        DataTable myDatatable = new DataTable();
        SqlConnection myConn = new SqlConnection();
        myConn.ConnectionString = connString;

        SqlCommand myCommand = new SqlCommand();
        myCommand.CommandType = CommandType.Text;
        myCommand.CommandText = stringSql;
        myCommand.Connection = myConn;

        SqlDataAdapter myAdapter = new SqlDataAdapter();
        myAdapter.SelectCommand = myCommand;

        myCommand.Parameters.Add("@vrm", SqlDbType.VarChar).Value = vrm_in;

        myAdapter.Fill(myDatatable);

        return myDatatable;
    }

    private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
    {
        string[] parameters = (string[])e.Argument;
        tblVRM = GetDataByVRM(parameters[0]); 
    }

    private void backgroundWorker2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        this.dataGridView1.DataSource = tblVRM;
        this.btnShowForDateRange.Enabled = true;
        this.btnFindVRM.Enabled = true;
        this.progressBar1.Visible = false;
        this.lblCount.Visible = true;
        this.lblCount.Text = "Count: " + tblVRM.Rows.Count.ToString();
        tblDateRange = new DataTable();
        btnExport.Enabled = true;
    }

【问题讨论】:

    标签: c# combobox filter


    【解决方案1】:

    由于您清除了“PopulateMachines”中的 ComboBox Items 集合,您必须再次添加该项目

    private void cboMachineGroup_SelectedIndexChanged(object sender, EventArgs e)
    {
        //this.cboMachines.Text = "";
    
        PopulateMachineList();
        cboMachines.Items.Insert(0, "-ALL MACHINES-");
        cboMachines.SelectedIndex = 0;
    }
    

    第二次尝试:

    private void btnShowForDateRange_Click(object sender, EventArgs e)
    {
    
        tblDateRange = new DataTable();
        this.btnShowForDateRange.Enabled = false;
        this.btnFindVRM.Enabled = false;
        this.progressBar1.Visible = true;
        btnExport.Enabled = false;
        cboMachines.Items.Insert(0, "-ALL MACHINES-");
        cboMachines.SelectedIndex = 0;
        string[] parameters = { dtStartDate.Value.ToString("yyyy-MM-dd"), dtEndDate.Value.ToString("yyyy-MM-dd"), this.cboMachineGroup.Text, this.cboMachines.Text  };
        this.backgroundWorker1.RunWorkerAsync(parameters);
    
    }
    

    【讨论】:

    • 嗨 Romano,我试过了,但是当我从 cboxMachinegroup 中选择时我的 datagridview 是空的,但是 cbomachine 里面有 allmachine。谢谢
    • 嗨,Kiran,我不确定我是否遇到了您的问题。在问题中,您没有从 DataGridView 中编写任何内容。您能否编辑您的问题并将 cb1,cb2 和 combobox1,combobox2 替换为代码中对象的名称。真的有助于更好地理解它
    • 当我从组合框 1 中选择时,我只想在组合框 2 上将文本显示为(所有机器/总计)。代码一切正常。
    • 我认为我的代码应该这样做。假设 combobox1 是 cboMachineGroup。
    • 嗨 Romano,我有 2 个组合框,一个数据网格视图,当我选择组合框 1 并单击按钮时显示从组合框过滤的数据,当我过滤组合框 1 和combobox2 它显示过滤后的数据。现在我的问题是当我选择组合框 1 并单击按钮时,组合框 2 应该有一个文本,而不是空白或空
    猜你喜欢
    • 2013-04-25
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    相关资源
    最近更新 更多