6

解決方法がわからない問題に直面しており、コミュニティが助けてくれることを願っています。

「リード」オブジェクトを管理するアプリを書いています。(これらはセールス リードです。) 私のプログラムの一部では、テキスト ファイルからリードをインポートします。これで、テキスト ファイルには多くの見込み顧客が含まれており、インポートしたいものもあれば、インポートしたくないものもあります。

プログラミング (および使用) を容易にするために、テキスト ファイルを List<Lead> オブジェクトに解析し、DataGridView の DataSource プロパティを設定してリードを表示するために DataGridView を使用しています。

私がやりたいことは、「インポート」と呼ばれる列をグリッドに追加し、ユーザーが各リードをインポートする必要があるかどうかを示すためにチェックできるチェックボックスを追加することです。

私の最初の考えは、Lead からクラスを派生させることです。

public Class LeadWithImportCheckbox : Lead
{
   bool bImport = false;

public bool Import { get { return bImport;} set { bImport = value;} } }

ただし、解析エンジンは Lead オブジェクトのリストを返します。リードを LeadWithImportCheckbox にダウンキャストできません。これは失敗します:

LeadWithImportCheckbox newLead = (LeadWithImportCheckbox)LeadFromParsingEngine;
これは無効なキャストです。

私が見る他のオプションは、LeadWithImportCheckbox のコンストラクターを作成することです。

public LeadWithImportCheckbox(Lead newlead)
{
  base.Property1 = newlead.Property1;
  base.Property2 = newlead.Property2;
  ....
  base.Property_n = newlead.Property_n;
}
これには 2 つの理由で問題があります。1 つは、Lead オブジェクトには数十のプロパティがあり、このコンストラクターを記述することは PITA です。

さらに悪いことに、Lead の基になる構造を変更した場合は、LeadWithImportCheckbox のこのコンストラクターを変更することを忘れないでください。これは私のコードのメンテナンスにとって危険です。

私の目標を達成するためのより良い方法はありますか?

4

11 に答える 11

7

または、PITA の側面を回避するには、リフレクションを使用します... (これを試してください...)

編集:私が最初に書いたように、フィールドではなくプロパティを使用してください...

public class NewLead : Lead
{
    public bool Insert;
    public NewLead(Lead lead, bool insert)
    {
        Insert = insert;
        foreach (PropertyInfo pi in typeof(Lead).GetProperties())
            GetType().GetProperty(pi.Name).SetValue
               (this, pi.GetValue(lead,null), null);
    }
}
于 2009-07-15T19:22:36.600 に答える
4
public class LeadListItem
{
    public Lead Lead { get; set; }
    public bool ShouldImport { get; set; }
}

つまり、Lead オブジェクトのコンテンツをコピーせずに、その参照を新しい LeadListItem オブジェクトに保存するだけです。これにより、元のオブジェクトの「外部」に追加情報が追加されます。

Lead のプロパティをグリッドに表示したい場合は、ほぼ確実にそれを行う方法があります。この質問に対する正しい答えを教えてくれた私に反対票を投じるのではなく、その質問をしてみませんか!

于 2009-07-15T19:01:58.903 に答える
3

見逃したかもしれないいくつかのオプション:

  • Lead オブジェクト自体を更新して Import プロパティ (デフォルトは false) を持つことができます。
  • "ImportLead" オブジェクトで Lead をペイロードとして扱う (必要に応じてジェネリックにする) ことができるので、大きなコンストラクターは必要ありません。
  • 最初にインポートしたいオブジェクトのみを含む新しいリード オブジェクト リストまたは列挙可能オブジェクトを作成します。
于 2009-07-15T19:02:25.907 に答える
1

これを行うには多くの方法がありますが、ここであなたが言ったことのために「正しい」方法が飛び出します:

プログラミング (および使用) を容易にするために、テキスト ファイルを List オブジェクトに解析し、DataGridView の DataSource プロパティを設定してリードを表示するために DataGridView を使用しています。

私がやりたいことは、「インポート」と呼ばれる列をグリッドに追加し、ユーザーが各リードをインポートする必要があるかどうかを示すためにチェックできるチェックボックスを追加することです。

オブジェクトLeadはそれ自体で十分に機能し、それに何らかのメタデータを添付したい - 別のLead分類 (つまりLeadWithImportCheckbox クラス) を作成したくない場合。

したがって、あなたの場合の最善のアプローチは、次のようなクラスを持つことです。

public class LeadInfo 
{
    private Lead lead;
    private bool shouldImport;

    public LeadInfo(Lead lead)
    {
        this.lead = lead;
        this.ShouldImport = false;
    }

    public bool ShouldImport 
    { 
        get { return shouldImport;  }
        set { shouldImport = value; }  
    }
}

これは、リストにさらにメタデータを追加したい場合 (たとえば、メタデータに関するリマインダーを毎週自分に送信する場合など) に適しています。

于 2009-07-15T19:15:56.927 に答える
1

正しい解決策がリストされているのを何度も見たので、もう一度投稿するのはかかとのように感じますが、これにアプローチする最善の方法は、インポート フラグを含む Lead オブジェクトのラッパーを作成することです。

オブジェクトにデータバインドしているため、Lead オブジェクトのプロパティが GridView に表示されない場合は、ラッパー オブジェクトの Lead プロパティを反映するパススルー プロパティを記述します。

問題は、データ モデルの固有の部分ではない何かをユーザーに表示したいということです。答えは、ユーザーに表示する前にデータをラップすることです。これにより、基になるモデルを変更せずに表示内容を制御できます。

Lead オブジェクトが将来何度も変更され、ラッパーへの変更が面倒になることが懸念される場合は、Lead オブジェクトに基づいて動的コード生成を調べることができます。これにより、同じフィールドを持つラッパー オブジェクトが自動的に生成されます。 Lead オブジェクトとインポート フラグ。率直に言って、これはおそらくこれほど単純なものに必要な作業よりもはるかに多くの作業です。

于 2009-07-15T19:40:06.737 に答える
1

あなたがしたいことは、グリッドにチェックボックス列を表示し、Lead オブジェクトにまったく関連付けないようにすることです。マークされた列 (および場合によっては元のリスト) を使用して、インポート リストとなる一連の新しいリストを作成します。

次に、新しく作成されたリストでやりたいことを処理します。

編集:リストを操作するときに注意すべきことの1つは、すべてのクラスオブジェクトが実際にはクラスへのポインターにすぎないという事実です。そのため、元のリストを操作して次のようなことを行う場合:

List<Lead> Importable = new List<Lead>();

for(int i=0, i++, i<viewGrid.Count)
    if(viewGrid[i].CheckedColumn.Checked)
        Importable.Add(OriginalList[i]);

そのオブジェクトは両方のリストに存在し、いずれかのリストでリードのデータを編集すると、両方が変更されます。

于 2009-07-15T19:00:22.137 に答える
0

Lead クラスにコピー コンストラクター (例: "Lead(Lead otherLead)") がある場合、LeadWithImportCheckbox はそれを継承し、LeadWithImportCheckbox コンストラクターでベースの Lead コンストラクターを呼び出すだけで済みます。したがって、LeadWithImportCheckbox が Lead の詳細を認識する必要はありません。 .

于 2009-07-15T19:09:17.750 に答える