1

最初に、私はC#に非常に慣れていないため、お詫び申し上げます。これはばかげた質問のように聞こえるかもしれません。ただし、インターネット上のどこでも、または購入したC#に関する数冊の本の中にも例を見つけることができませんでした

SQL データベースからロード時に大量のデータを取得するフォームがあります。ファーストネームとラストネームは、2 つの別個のコンボボックスに挿入され、1 つは「First Last」として情報を表示し、もう 1 つは「Last, First」として情報を表示し、名前を簡単に参照できるようにします。

先日、ここで助けてくれたおかげで、単一のテキストボックスにコンボボックスの選択した値を入力する方法を学びました。助けてくれてありがとう。

私がする必要があるのは、ユーザーがコンボボックスから選択されたときに、そのユーザーのすべての情報がフォームの特定のテキストボックス内に表示されることです。例は、

LastName = textBox1
FirstName = textBox2
MiddleName = textBox3

これらのフィールドごとに個別の文字列を記述する必要がありますか?それとも、すべてのデータについて SQL データベースにクエリを実行する 1 つの文字列からそのデータを取得できますか?

ご提供いただけるご支援をいただければ幸いです。

これが私がこれまでに持っているものです

enter code here

  namespace Tempus.Menus
 {
 public partial class Employees : Form
 {
    public Employees()
    {
        InitializeComponent();


        //Connect to database for Employees Table Headers
        SqlConnection myConnection = new SqlConnection(@"Server=Server4\INSTANCE;Integrated Security=true;" +
            "user id=userID;password=password;" +
            "Trusted_Connection=yes;" +
            "Database=Database;" +
            "connection timeout=30");

        try
        {
            myConnection.Open();
            string SqlDataPull = String.Format("SELECT * FROM Employees WHERE Lname IS NOT NULL {0}", (checkBox1.Checked ? "AND Active='Y'" : ""));
            //string SqlDataPull2 = String.Format("SELECT * FROM Employees WHERE Fname IS NOT NULL {0} ORDER By Fname", (checkBox1.Checked ? "AND Active='Y'" : ""));
            SqlCommand cmd = new SqlCommand(SqlDataPull, myConnection);
            cmd.CommandType = CommandType.Text;
            SqlDataReader dr = cmd.ExecuteReader();



            while (dr.Read())
            {
                string strEmployee = String.Format("{0}  {1}", dr["Fname"], dr["Lname"], dr["Mname"], dr["DOH"], dr["DOT"], dr["Active"], dr["DoNotRehireReason"], dr["PTO-balance"], dr["SNP-balance"], dr["Cred"]);

                comboBox1.Items.Add(strEmployee);

                string strEmployee2 = String.Format("{0}, {1}", dr["Lname"], dr["Fname"]);

                comboBox2.Items.Add(strEmployee2);

                int Fname = dr.GetInt32(0);
                string firstName = String.Format("{0}", dr["Fname"]);

            }


        }
        catch (Exception e)
        {
            MessageBox.Show(e.ToString());
        }
        finally
        {
            if (myConnection != null)
            {
                myConnection.Dispose();
            }


        }
        comboBox1.SelectedIndexChanged += comboBox1_SelectedIndexChanged;

        comboBox2.SelectedIndexChanged += comboBox2_SelectedIndexChanged;
    }
    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (comboBox1.SelectedIndex == -1)
        {
            textBox1.Text = string.Empty;
        }
        else
        {

            textBox1.Text = comboBox1.SelectedItem.ToString();

        }
    }


    private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (comboBox2.SelectedIndex == -1)
        {
            textBox1.Text = string.Empty;
        }
        else
        {

            textBox1.Text = comboBox2.SelectedItem.ToString();
        }
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {

    }

    private void Employees_Load(object sender, EventArgs e)
    {

    }


    private void label1_Click(object sender, EventArgs e)
    {

    }






    private void button1_Click(object sender, EventArgs e)
    {
        Main myNewForm = new Main();

        myNewForm.Show();

        this.Close();
    }


    private void button2_Click(object sender, EventArgs e)
    {
        Reports myNewForm = new Reports();

        myNewForm.Show();

        this.Close();
    }

    private void textBox2_TextChanged(object sender, EventArgs e)
    {

    }

    private void textBox3_TextChanged(object sender, EventArgs e)
    {

    }

    private void textBox4_TextChanged(object sender, EventArgs e)
    {

    }

    private void textBox5_TextChanged(object sender, EventArgs e)
    {

    }

    private void textBox8_TextChanged(object sender, EventArgs e)
    {

    }

    private void textBox9_TextChanged(object sender, EventArgs e)
    {

    }

    private void textBox7_TextChanged(object sender, EventArgs e)
    {

    }

    private void textBox10_TextChanged(object sender, EventArgs e)
    {

    }

    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        if (checkBox1.Checked)

                {

            // logic here for if the box has now been checked


                }

            else

                {

                // what to do if the box has been unchecked


                }

       }
    }
}
4

3 に答える 3

2

Employee クラスを作成することをお勧めします

  class Employee
{
    public string firstName { get; set; }
    public string middleName { get; set;}
    public string lastName { get; set; }
    public string fullName { get; set; }

    //add other attributes here just the same...

    public Employee(string first, string middle, string last, string full)
    {
        firstName = first;
        middleName = middle;
        lastName = last;
        fullName = full;

        //assign ther other attributes..
    }


}

List<Employee> employees = new List<Employee>();返された SQL データを追加するリストを作成できます...

    SqlDataAdapter da = new SqlDataAdapter(SqlDataPull, myConnection); 
DataSet ds = new DataSet();
da.Fill(ds, "Employees");

foreach (DataRow row in ds.Tables["Employees"].Rows)
{
  employees.Add(dr["Fname"], dr["Lname"], dr["Mname"], dr["FullName"]);
}

SQLクエリでフルネームを返すことができますRTRIM(Lname) + ',' + RTRIM(Fname) AS FullName

その後、リストをコンボボックスのデータソースとして追加し、選択したインデックスを参照して値をテキスト ボックスに追加できます。

于 2012-07-23T19:12:05.737 に答える
2

あなたが提供したコンテキストに基づいて、ここに私のフィードバックがあります。該当する点を含めてください。残りは無視してください。そして、それがあなたの質問にも答えることを願っています。

  • これは単一層アプリケーションです。保守性、読みやすさなどの点で優れている階層構造 (詳細はこちら) を検討することをお勧めします。

  • 動的 SQL は多くの側面 (セキュリティ リスクを含む) で悪いと見なされているため、ストアド プロシージャ (または LINQ-to-SQL または任意の ORM プロバイダー) によって格納される利点を見てください。この記事は良い出発点です。

  • aを実行してSELECT * FROM EMPLOYEE10 (場合によってはそれ以上) の列を読み取りますが、使用するのは列FNameLName列だけです。(ストアドプロシージャまたは同等のもので)のようなものを使用することを提案しSELECT FName, LName FROM EMPLOYEE、これらをデータレイヤーの関連するプロパティを持つオブジェクトに入力します。UI レイヤーでは、1 回の呼び出しでデータをフェッチし、同じデータを適切な形式 (スペースを含むものとコンマを含むもの) で両方のコンボ ボックスにバインドできます。

  • 最後に、特定の従業員 (姓に基づくなど) の詳細 (対応するプロパティにマップされたすべての列) を取得するための 2 つ目のメソッドをデータ層に用意します。UI レイヤーでは、コンボ ボックスで選択した項目に基づいて、対応する従業員の詳細を取得し、テキスト ボックスに表示できます。

この方法を使用せず、「応急処置」が必要な場合は、この方法は非常に非効率的で、保守が難しく、セキュリティの問題が発生しやすいことを覚えておいてください。ここでは、コンボボックスで選択した値に対して同じデータベース呼び出しを (WHERE句を使用して) 再度行い、詳細をテキストボックスにバインドします。

お役に立てれば。

于 2012-07-23T19:07:26.663 に答える
1

SQL の使用に慣れていませんが、コンボボックスに必要なすべての情報があれば、既に持っているイベントを使用できます。

コンボボックス1.SelectedIndexChanged += コンボボックス1_SelectedIndexChanged; コンボボックス2.SelectedIndexChanged += コンボボックス2_SelectedIndexChanged;

私には、comboBox1 には従業員に関するすべての情報が含まれており、comboBox2 には姓名のみが含まれているように見えます。コンボ ボックスの作成に使用する while ループに基づきます。

そのため、ユーザーが SelectedIndexChanged のコンボボックス 1 の選択をクリックすると、次のようなことができます。

    if(comboBox1.SelectedIndex != -1)
    {
        string[]parts = comboBox1.Items[comboBox1.SelectedIndex].ToString().Split(' ');
        textBox1.Text = parts[0];//Index for First Name
        textBox2.Text = parts[1];//Index for Last Name
        textBox3.Text = parts[2];//Index for Middle Name
    }

注: スペースで文字列を分割する .Split(' ') を使用しましたが、コンボボックスからテキストを取得するときに、さまざまなデータを区切る文字を使用します。

SQLなどで何をしようとしているのか完全にはわかりませんが、SQLからロードした後にコンボボックスにデータがある場合は、データを簡単に取得して適切なテキストボックスに配置することができます。データベース。

お役に立てれば。

于 2012-07-23T19:18:35.710 に答える