【问题标题】:How to make dependent combo boxes work correctly如何使依赖组合框正常工作
【发布时间】:2016-05-24 12:27:35
【问题描述】:

我有两个组合框“年份”和“金额”在它们的顶部我确实获得了用户信息的值,因为当使用用户 ID 文本框调用时有文本框填充了正确的数据。

两个组合框也填充了正确的数据,但我必须手动选择年份和对应的金额。

我需要帮助,当我调用数据“年份”和“金额”时,组合框中应该可见。当我选择年份时,金额应相应更改。最后但并非最不重要的是,我的重置没有清除组合框。

using System;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Data;

namespace dss
{
    public partial class Form1 : Form

    {
        SqlConnection con = new SqlConnection("Data Source=USER-PC\\sqlexpress;Initial Catalog=JG_Test;Integrated Security=True");

        public Form1()
        {
            InitializeComponent();

        }

        private void btnSearch_Click(object sender, EventArgs e)
        {

            cmbYear.Items.Clear();
            string sql = "";
            con.Open();
            SqlCommand cmd = new SqlCommand();

            try
            {
                sql += "SELECT m.MemberId, m.Name, m.Address, m.Cellular, m.Email, p.PaymentId, p.Year, p.Amount from Members as m";
                sql += " INNER JOIN Payments as p ON m.MemberId = p.MemberId";
                sql += " WHERE m.MemberId = '" + tbID.Text + "' ORDER BY p.Year ASC";

            cmd.Connection = con;
            cmd.CommandText = sql;

                SqlDataAdapter da = new SqlDataAdapter(cmd);
                DataTable dt = new DataTable();
                da.Fill(dt);
                con.Close();
                if(dt.Rows.Count >0)
                {
                    for(int i = 0; i<=dt.Rows.Count -1;i++)
                    {
                        tbID.Text = dt.Rows[i]["MemberId"].ToString();
                        tbName.Text = dt.Rows[i]["Name"].ToString();
                        tbCellular.Text = dt.Rows[i]["Cellular"].ToString();
                        tbEmail.Text = dt.Rows[i]["Email"].ToString();
                        tbAddress.Text = dt.Rows[i]["Address"].ToString();

                        cmbAmount.Items.Add(dt.Rows[i]["Amount"].ToString());
                        cmbYear.Items.Add(dt.Rows[i]["Year"].ToString());

                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
        }

        //This part displaying og the existing data from all the fileds corrssponding within the database//
        private void btnAdd_Click(object sender, EventArgs e)
        {
            {
                con.Open();

                string Sql = "INSERT INTO Members ( MemberId, Name, Cellular, Email, Address ) VALUES " + " (@Id, @name, @cell, @email, @address)";

                using (SqlCommand cmd = new SqlCommand(Sql, con))

                {
                    cmd.CommandText = Sql;
                    cmd.Parameters.AddWithValue("@Id", tbID.Text);
                    cmd.Parameters.AddWithValue("@name", tbName.Text);
                    cmd.Parameters.AddWithValue("@cell", tbCellular.Text);
                    cmd.Parameters.AddWithValue("@email", tbCellular.Text);
                    cmd.Parameters.AddWithValue("@address", tbAddress.Text);
                    cmd.ExecuteNonQuery();

                    Sql = "INSERT INTO Payments ( MemberId, [Year], [Amount] ) VALUES " + " (@Id, Amount, Year)";

                    cmd.Parameters.Clear();
                    cmd.CommandText = Sql;
                    cmd.Parameters.AddWithValue("@Id", tbID.Text);
                    cmd.Parameters.AddWithValue("@year", cmbYear.Text);
                    cmd.Parameters.AddWithValue("@amount", cmbAmount.Text);
                    cmd.ExecuteNonQuery();

                    MessageBox.Show("Data Added");

                    tbID.Clear(); tbName.Clear(); tbCellular.Clear(); tbEmail.Clear(); tbAddress.Clear(); cmbYear.Items.Clear(); cmbAmount.Items.Clear();
                    con.Close();
                }
            }
        }

        //This part represents adding of  new input data from all the fileds into the database//
        private void btnUpdate_Click(object sender, EventArgs e)
        {
            try
            {
                SqlCommand cmd = new SqlCommand();
                string Sql = "UPDATE Members SET MemberId = '" + tbID.Text + "', Name = '" + tbName.Text + "', Cellular = '" + tbCellular.Text + "', Email = '" + tbEmail.Text + "', Address = '" + tbAddress.Text + "' WHERE MemberId = '" + tbID.Text + "' ";
                cmd.CommandText = Sql;
                cmd.Connection = con;
                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();

                Sql = "UPDATE Payments SET MemberId = '" + tbID.Text + "', Year = '" + cmbYear.Text + "', Amount = '" + cmbAmount.Text + "' WHERE MemberId = '" + tbID.Text + "' ";
                cmd.CommandText = Sql;
                cmd.Connection = con;
                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();
                MessageBox.Show("Data Updated");
                tbID.Clear(); tbName.Clear(); tbAddress.Clear(); tbCellular.Clear(); tbEmail.Clear(); cmbYear.Items.Clear(); cmbAmount.Items.Clear();

            }
            catch (Exception error)
            {
                MessageBox.Show(error.ToString());
            }
        }

        //This part represents deleteing of input data from all the fileds into the database//
        private void btnDelete_Click(object sender, EventArgs e)
        {
            try
            {
                SqlCommand cmd = new SqlCommand();
                string Sql = "DELETE FROM Members WHERE MemberId = '" + tbID.Text + "' ";
                cmd.CommandText = Sql;
                cmd.Connection = con;
                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();

                Sql = "DELETE  FROM Payments WHERE MemberId = '" + tbID.Text + "' ";
                cmd.CommandText = Sql;
                cmd.Connection = con;
                con.Open();
                cmd.ExecuteNonQuery();
                tbID.Clear(); tbName.Clear(); tbAddress.Clear(); tbCellular.Clear(); tbEmail.Clear(); cmbYear.Items.Clear(); cmbAmount.Items.Clear();
                MessageBox.Show("Data Deleted");

                con.Close();
            }
            catch (Exception error)
            {
                MessageBox.Show(error.ToString());
            }

        }

        //This part represents clearing of input data from all the fileds//
        private void btnReset_Click(object sender, EventArgs e)
        {
            tbID.Clear(); tbName.Clear(); tbAddress.Clear(); tbCellular.Clear(); tbEmail.Clear(); cmbYear.Items.Clear(); cmbAmount.Items.Clear();
        }

        //This part represents shuting down the application//
        private void btnExit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        }
    }

【问题讨论】:

  • 是的,你会的,因为两个组合框之间没有关联,而且通常不应该存在。你的重置看起来应该清除组合框。你确定代码正在运行吗?
  • 肯定的!!!正是我没有别的代码!!!
  • 你一步步完成了吗?它只是显示不去的文字吗?还是留下的所有物品?
  • 正如我在最初的评论中提到的,它正在获取所有正确的数据,但只是隐藏了年份和金额,我必须单击指向下方的侧箭头来切换以查看年份和还有金额。
  • 是的,你会 - 这就是组合框的工作方式 - 如果你的数据是年“1972”值“200”和年“2016”和值“9237”,你可以选择 1972 和 9237 ..因为它们完全不相关..

标签: c# .net visual-studio combobox


【解决方案1】:

我会倾向于简化一些事情。将个人数据和财务数据视为两部分。

首先,请求个人数据 - 保持简单

private void btnSearch_Click(object sender, EventArgs e)
{
string sql = "SELECT MemberId, Name, Address, Cellular, Email FROM Members WHERE MemberId = @Id";

SqlConnection con = new SqlConnection("myconnectionstring");
SqlCommand cmd = new SqlCommand(sql,con);

cmd.Parameters.Add("@Id",SqlDbType.Int).Value = tbID.Text;

DataTable dt = new DataTable();

try
{
    con.Open();
    dt.Load(cmd.ExecuteReader());
    con.Close();
}
catch (Exception ex)
{
con.Close();
Console.WriteLine(ex.Message);

}

tbID.Text = dt.Rows[0]["MemberId"].ToString();
tbName.Text = dt.Rows[0]["Name"].ToString();
tbCellular.Text = dt.Rows[0]["Cellular"].ToString();
tbEmail.Text = dt.Rows[0]["Email"].ToString();
tbAddress.Text = dt.Rows[0]["Address"].ToString();
}

完成后,进入第二部分 - 年/金额组合(几乎相同的代码)

string sql = "SELECT Year, Amount FROM Payments WHERE MemberId = @Id"

SqlConnection con = new SqlConnection("myconnectionstring");
SqlCommand cmd = new SqlCommand(sql,con);

cmd.Parameters.Add("@Id",SqlDbType.Int).Value = tbID.Text;

DataTable dt = new DataTable();

try
{
    con.Open();
    dt.Load(cmd.ExecuteReader());
    con.Close();
}
catch (Exception ex)
{
con.Close();
Console.WriteLine(ex.Message);

}

cmbYear.DataSource = dt;
cmbYear.DisplayMember = "Year";
cmbYear.ValueMember = "Amount";

最后,使用

告诉文本框需要阅读的内容
private void cmbYear_SelectionChangeCommitted(object sender, EventArgs e)
{

    amountTxt.Text = cmbYear.SelectedValue.ToString();

}

在组合框的SelectionChangeCommitted 事件中

你应该已经排序了!

【讨论】:

  • 感谢您的建议,我实际上在现有的解决方案中添加了三行代码。我确实得到了所需的功能,但是有一些小“故障”,比如我让“年份”正确显示,但“金额”不会出现,除非我选择第二个“年份”值,然后如果我切换,我可以看到两者。最后,“金额”的“清除”功能不起作用。
  • 您还在使用组合框来显示金额吗?正如您之前所说,您每年只能显示一个值,因此组合框将是错误的控件。将年份组合框的选定索引属性设置为 -1,这样您的金额只会在单击年份时显示
  • 是的!但是现在我将其更改为“文本框”,结果是当我选择“年份”而不是“金额”时,我在“金额”文本框中得到了“年份”。这令人困惑。
  • 假设您使用了我提供的解决方案,请确保您已将 valuemember 属性设置为金额,例如 combobox.ValueMember = "Amount",并确保您发送的是 selectedvalue,而不是 selectedtext
  • 是否可以加入我的现场直播,看看发生了什么,这样可以节省很多时间和思考,我相信我们已经接近突破,非常简单但又如此复杂.
猜你喜欢
  • 1970-01-01
  • 2021-05-08
  • 2012-10-10
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多