0

このコードを約 3 時間使用しましたが、機能しません。ComboBox にオブジェクトのリスト (clsMarcas) を入力し、SelectedItem プロパティを使用して同じタイプのオブジェクトを割り当てて DisplayMember を表示しても、何も起こりません。案内していただけますか?

public class clsMarcas
{
    public int IdMarca {get; set;}
    public string NombreMarca {get; set;}
    public clsMarcas()
    {

    }
    public clsMarcas(string strMarca)
    {
        this.NombreMarca = strMarca;
    }

}


public class clsAuto
{
    public string Dominio {get; set;}
    public clsMarcas Marca {get; set;}        

    public clsAuto()
    {

    }

    public clsAuto(string Dominio, clsMarcas Marca)
    {
        this.Dominio = Dominio;
        this.Marca = Marca;
    }
}


public partial class frmAutosAE
{
    public frmAutosAE()
    {
        InitializeComponent();
    }
    private clsAuto oAuto;
    private clsMarcas defaultMarca;

    protected override void OnLoad(System.EventArgs e)
    {
        base.OnLoad(e);
        CargarMarcas();

        if (oAuto != null)
        {
            this.txtDominio.Text = oAuto.Dominio;
            SeleccionarMarca(oAuto.Marca);

        }
    }


    private void SeleccionarMarca(clsMarcas Marca)
    {
        cboMarcas.SelectedItem = Marca;

    }
    public void SetAuto(clsAuto oAuto)
    {
        this.oAuto = oAuto;
    }

    public clsAuto GetAuto()
    {
        return oAuto;
    }

    private void CargarMarcas()
    {
        List<clsMarcas> ListaMarcas = GestorDeRepositorio.GetInstancia().Repositorio.GetMarcas();
        this.cboMarcas.DisplayMember = "NombreMarca";
        defaultMarca = new clsMarcas { NombreMarca = "<Seleccione una marca>" };
        cboMarcas.Items.Add(defaultMarca);
        cboMarcas.SelectedIndex = 0;

        foreach (clsMarcas elemento in ListaMarcas)
        {
            this.cboMarcas.Items.Add(elemento);
        }
    }



    public void btnGuardar_Click(System.Object sender, System.EventArgs e)
    {
        if (validarDatos())
        {
            if (oAuto == null)
            {
                oAuto = new clsAuto();
            }

            oAuto.Dominio = this.txtDominio.Text;
            oAuto.Marca=GetMarcaSeleccionada();


            this.DialogResult = System.Windows.Forms.DialogResult.OK;
        }
    }



    private clsMarcas GetMarcaSeleccionada()
    {
        clsMarcas marca=(clsMarcas)cboMarcas.SelectedItem;
        if (marca==defaultMarca)
        {
            return null;
        }
        return marca;
    }



    public void btnCancelar_Click(System.Object sender, System.EventArgs e)
    {
        this.DialogResult = System.Windows.Forms.DialogResult.Cancel;
    }


    public List<clsMarcas> GetMarcas()
    {
        Marcas.Clear();
        try
        {

            using (OleDbConnection cnn = new OleDbConnection(ConnectionString.ToString()))
            {
                cnn.Open();
                OleDbTransaction tran = cnn.BeginTransaction();
                string strSQL = "SELECT * FROM Marcas";
                OleDbCommand comando = new OleDbCommand(strSQL, cnn, tran);

                using (OleDbDataReader oReader = comando.ExecuteReader())
                {
                    while (oReader.Read())
                    {
                        clsMarcas oMarca = new clsMarcas();
                        oMarca.IdMarca = oReader.GetInt32(0);
                        oMarca.NombreMarca = oReader.GetString(1);
                        Marcas.Add(oMarca);
                    }

                }

                tran.Commit();

            }


        }
        catch (Exception ex)
        {

            throw (ex);
        }
        return Marcas;
    }
}
4

3 に答える 3

0

Load イベント以降に SelectedItem を設定します。フォームのコンストラクターで SelectedItem を設定しないでください

于 2012-09-03T04:36:03.020 に答える
0

完全なコードをテストしていませんが、オブジェクトを DisplayMember に割り当てると、リストでロードしたオブジェクトと (メモリ内で) 同じオブジェクトではない可能性が高いため、これは機能しない可能性があります。(リポジトリがオブジェクト インスタンスを再利用しない限り、可能性は低いです)。

したがって、コンボ ボックスがリストで割り当てているオブジェクトを検索するとき、それが見つかりません。

clsMarcas の Equals メソッドをオーバーライドして、ID に基づいて等価性を提供してみてください (たとえば)。

それ以外の場合は、インデックスで選択するか、(ID に基づいて) リスト内で自分でオブジェクトを見つけてから、リスト内のオブジェクトのインスタンスに DisplayMember を割り当てます。

于 2012-09-03T00:34:34.390 に答える
0

まず、コードをクリーンアップします

OnLoad をオーバーライドしないでください。代わりにイベント ハンドラーを追加してください。

protected override void OnLoad(System.EventArgs e)
{
    // your code
}

に変更する必要があります

public frmAutosAE()
{
    InitializeComponent();
    Load += FormLoaded;
}

public void FormLoaded(object sender, EventArgs e)
{
    // your code
}

setter/getter メソッドの代わりにプロパティを使用します。

public void SetAuto(clsAuto oAuto)
{
    this.oAuto = oAuto;
}
    
public clsAuto GetAuto()
{
    return oAuto;
}

する必要があります

public clsAuto Auto { get; set; }

using完全修飾名の代わりにディレクティブを使用します。

this.DialogResult = System.Windows.Forms.DialogResult.Cancel;

する必要があります

DialogResult = DialogResult.Cancel; 
// add using System.Windows.Forms to the top of the file

最後に、C# の命名規則を学び、それを使用してください。クラスは大文字で始まりますが、ローカル変数は大文字ではありません。

次に、問題を修正します

protected override void OnLoad(System.EventArgs e)
{
    base.OnLoad(e);
    CargarMarcas();

    if (oAuto != null)
    {
        this.txtDominio.Text = oAuto.Dominio;
        SeleccionarMarca(oAuto.Marca);

    }
}

これは、あなたが呼び出す唯一の場所ですSeleccionarMarca。ここでoAutoは、常にnull になるため、選択コードが呼び出されることはありません。oAuto問題を解決するために初期化します。

ただし、Xavier Poinas が彼の回答で指摘したEqualsように、たとえば次のように clsMarcas でオーバーライドする必要がある可能性が最も高いでしょう。

public override bool Equals(object obj)
{
    var marcas = obj as clsMarcas;
    if (marcas != null)
    {
        return IdMarca == marcas.IdMarca;
    }
    return false;
}

このソリューションは私のマシンでテストされており、機能します。

于 2012-09-03T01:20:59.323 に答える