6

コンボボックスをデータソース、ディスプレイメンバー、バリューメンバーにバインドしています。私のコンピュータでは正常に動作していますが、クライアント PC では動作していません。以下は私のソースコードです:

cbxAlloyBinding メソッドは、UserControl のコンストラクターから呼び出されます。

private void cbxAlloyBinding()
    {
        DataTable dt = new DataTable();
        SqlDataAdapter adp = new SqlDataAdapter("SELECT alloyName,alloyId FROM alloy", con);
        adp.Fill(dt);

        if (dt.Rows.Count > 0)
        {
            cbxMetal.DisplayMember = "alloyName";
            cbxMetal.ValueMember = "alloyId";
            cbxMetal.DataSource = dt;
        }
        else
        {
            cbxMetal.Text = "";
        }
    }

    private void cbxMetal_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (cbxMetal.SelectedIndex != -1)
        {
            DataTable dt = new DataTable();
            tempcmd = new SqlCommand("SELECT specification,alloyCode FROM alloy where alloyId='" + cbxMetal.SelectedValue + "'", con);
            SqlDataAdapter adp = new SqlDataAdapter(tempcmd);
            adp.Fill(dt);
            if (dt.Rows.Count > 0)
            {
                txtSpecification.Text = dt.Rows[0]["alloyCode"].ToString();
                txtSupplyConditions.Text = dt.Rows[0]["specification"].ToString();
                cbxheatBinding();
            }
            else
            {
                txtSpecification.Text = "";
            }

        }
    }

これは過去 2 日間から私を悩ませており、ほぼすべてのトリックを試しましたが、まだ機能していません。

クライアントの PC は、Windows 7 Ultimate、SQL Server 2005、および .net Framework 3.5 を使用しています。

4

8 に答える 8

6

これは、コンストラクターで iscbxMetal_SelectedIndexChangedが呼び出される前に呼び出された場合に確実に発生します。cbxAlloyBinding()

たとえば (以下のコードを参照)、コンストラクターの前cbxAlloyBinding()に来る可能性のあるコンストラクターに他のコンボボックス バインディングがあり、それらのバインディングが を呼び出している場合がありますcbxMetal_SelectedIndexChanged

public Constructor()
{
        InitializeComponent();

        cbxheatBinding();      //1st Three Binding Methods may be somehow related to your cbxMetal,
        dtpStartDateBinding(); //which leads them to call cbxMetal_SelectedIndexChanged method.
        dtpEndDateBinding();
        cbxAlloyBinding();
}

私が疑っているのは、cbxMetal.DataSourceあなたがコードの他のポイントから設定され、かなり前DisplayMemberValueMember割り当てられていることです。

覚えておいてください、次のSystem.DataRow.DataRowView場合にのみ発生します

ComboBox.SelectedValueValueMember割り当て前に呼び出されます。

于 2013-03-13T07:25:31.830 に答える
0

私はこれを解決しました:

/*First get DataSource*/
comboBox1.DataSource = dt;
/*Then determine DisplayMember y ValueMember*/ 
comboBox1.DisplayMember = "YOUR_FIELD_NAME";
comboBox1.ValueMember = "YOUR_OTHER_FIELD_NAME";

これは、System.Data.DataTable または List データ ソースでのみ機能します。

于 2014-04-14T17:59:00.100 に答える
0

問題はここに貼り付けたコードではないようです。クライアント環境、接続、権限などに問題がある可能性があります。「クライアント PC で動作していない」という詳細情報を提供する必要があります。彼らが使用しているシステム、エラーは何ですか、クライアント側でデバッグを試みましたか?

*編集: *次に、最初からすべての操作をたどって問題を見つけなければなりません。私のアドバイスは、ダミーの Windows フォーム アプリケーション、標準フォーム、コンボボックス、およびボタンを作成することです。ボタンのクリックイベントで、あなたがしたことをするだけです。コンボをバインドして、この一時アプリをクライアントに送信するだけです。それが機能する場合は、ステップバイステップで実行します.例:

private void button1_Click(object sender, EventArgs e)
    {
        string conStr = "Data Source=PC-303\\SQLEXPRESS;Initial Catalog=sokaklar;User ID=sa;Password=*****";

        SqlDataAdapter adapter = new SqlDataAdapter("SELECT DISTINCT IL, IL_ID FROM sokaklar ORDER BY IL", new SqlConnection(conStr));
        DataTable dt = new System.Data.DataTable();
        adapter.Fill(dt);            

        comboBox1.DisplayMember = "IL";
        comboBox1.ValueMember = "IL_ID";
        comboBox1.DataSource = dt;            
    }

このアプリを 1 分で作成しましたが、うまく機能しています。

于 2013-01-31T07:35:06.743 に答える
-1

「comboBox1.SelectedValue」はオブジェクトを返し、文字列として変換したいので Convert.ToString(comboBox1.SelectedValue) に変換してから使用します

例えば:

  tempcmd = new SqlCommand("SELECT specification,alloyCode FROM alloy where alloyId='" + Convert.ToString(cbxMetal.SelectedValue) + "'", con);
于 2013-01-31T11:08:47.163 に答える