-1

このアプローチを実装する必要があります。つまり、2 種類のデータを 1 つのパラメーター セットとして 1 つのパラメーターとして送信し、1 Typeつの型でこれら 2 つのパラメーターを保持できるようにする必要があります。Typeそうすれば、それを何らかの方法で処理するために渡すことができます。

最初のデータ項目は次のとおりです。

  • 表示する列、名前: displayed

2 番目のデータ項目:

  • その Columnsのコピー (または一部のみdisplayed) は、ソースが同じであるため、これらの列のみが表示されません... つまり、Columns to omitであるため、次のように名前を付けました。 omitted

どちらも私が名前を付けたタイプの列です-SelectedColumns

public class SelectedcColoumns
{
    public enum renederingMode
    {
        Displayed,
        omitted
    }
    public class omitted
    {

    }
    public class displayed
    {
    }
}

その SetOfColumns を表示するための要求は、テーブル名を選択することによって行われます。したがって、表示されるデータとしての Column クラスは、ユーザーが選択した利用可能なソースに基づいて異なりSelectedColumnsます。

public class tableNames
{
   public static readonly string tblCustomers = "tblCustomers";
   public static readonly string tblProducts = "tblProducts";
}

public class TblColumns
{
    public class tblCustomers
    {
        public const string custID = "custID",
                            Name = "Name",
                            Phone = "Phone";
                            Email = "Email";
  
    }
    public class tblProducts 
    {
        public const string PrudctID = "PrudctID ",
                            PrudctName = "PrudctID",
                            PrudctCategory = "PrudctCategory";
    }
    ...etc'

}

ユーザーがテーブル列のセットを選択すると、この例では、ユーザーはいずれかのテーブルから列を選択できCustomersますProducts(例:SelectedColumnstblCustomers)。次に、ユーザーが除外するために選択したリストの別のリストが必要です。 (表示しない) 使用可能なすべてのテーブル列から。

ユーザーが Table Customers をテーブルとして選択したとします。tblCustomers.custID+を省略し tblCustomer.Emailたのは、名前と電話番号のみを表示する必要があるためです。

私が遭遇した問題は、これらのパラメーターを手の届くところに置いているときです (テーブル名 + 省略する列)。どうすればそれをプロセスに送信できますか ( One Parameterとして渡す)? そのため、これTypeを送信パラメーターとして保持するために、専用のクラスを作成しました: all columns+omitted Columns一体型です。

これは私が現在立ち往生しているところです。ユーザーの選択からパラメーターを構築/構築するためにそれを使用する方法を知る必要があります。

public class SelectedColoumns
{
    public enum renederingMode
    {
        Displayed,
        omitted
    }
        public class omitted
        {
           List<string> omitCols_ListStr = new List<string>();
        }
       
        public class displayed
        {
           List<string> dispCols_ListStr = new List<string>();
        }
}

この部分では、次のメソッドを使用して、データのサプライヤーreflectionとして列のリストを取得します。

ネストされた Class-Fields, As List<string>, By を取得し、ネストされclass-name-を取得しますType

public static List<string> anyNestedClassFiledsAsListByType<ClassToReturnOneOfitsNested_Fields>(string NetedClassName)
 {
                var RetNestedClassFildsListValues = typeof(ClassToReturnOneOFitsNested).GetNestedTypes()
                    .First(t => String.Compare(t.Name, NetedClassName, true) == 0).GetFields(BindingFlags.Public | BindingFlags.Static)
                    .Where(f => f.FieldType == typeof(string)).Select(f => (string)f.GetValue(null)).ToList();
                return RetNestedClassFildsListValues;
            }

これを生成するには、上記の方法を使用できます

var TableColumns_ALL = 
anyNestedClassFldsAsListByType<TblColumns>(tableNames.tblCustomers);

私の質問は、TableColumns_ALL + 選択した列を送信して省略し、以下で処理する必要があるクラスに関連していrenderSelectedTable()ます。

したがって、リフレクションの複雑さよりもさらに基本的なことですが、それでもポッパーを構築する方法がわからないSelectedColumns classため、メソッドはパラメーターとして送信されるこの新しいデータ型の構造に対応し、フォーマットします。このようなもの。

public void renderSelectedTable(SelectedColoumns CurrentUserSelectedCols)
{
    StringBuilder NwTRLoopSB = new StringBuilder();

    string curRowStyle= string.Empty,
           nwLine = Environment.NewLine + "\t\t\t",
           BaseTemplateTD = string.Empty;

    NwTRLoopSB.Append(
            string.Format(
                "<table id='tbl_Settings' cellspacing='0' border='1'><tr id='TR_headers'{0}>{1}",
                curRowStyle,
                nwLine
                )._Dhtml_DoubleQoutes()
        );
    foreach (var Item in SelectedListStr.Select((Val, counter) => new { Value = Val, Index = counter }))
    {
            curRowStyle = Lsts.DynamicStyle_Generator(Item.Index);

            if(Lsts.ExcludeColumns(Item.Value, OmittedCols))
            {
                BaseTemplateTD = string.Format("<td>{0}</td>{1}", Item.Value, nwLine)._Dhtml_DoubleQoutes();
                NwTRLoopSB.Append(BaseTemplateTD);
            }    
      
    }///ENd TR cells generator Section

    NwTRLoopSB.Append("</tr></table>");
    return NwTRLoopSB.ToString();

}
4

2 に答える 2

1

私はこのようにアプローチします:

public class Column{
    public string Name { get; set; }
    public bool Visible { get; set; }
}

public class Grid{
    public List<Column> Columns { get; set; }
}

そのため、表示されている列または省略された列を使用して完全なテーブルを簡単に定義できました。OPの例では:

public class SelectedColumns
{
    //instead of the enum you would have boolean in the column type "Visible" (whether is shown or not)
    public enum renederingMode
    {
        Displayed,
        omitted
    }
    // instead of both these you would have a List o Column types that have a name AND a boolean, so you have your List<string> and a boolean to indicate whether it is visible or ommited. Well at least that's how I understood it.
    public class ommited
    {

    }
    public class displayed
    {
    }
}
于 2012-12-19T20:24:32.723 に答える
0

だから..最初に..設計上の注意: 列のリストが与えられると..列を表示するか、列を表示しないかのいずれかになります..可視性に関する他のオプションはありません. したがって、実際には、表示する列または除外する列のいずれかの単一のリストを渡すだけで済みますが、両方を渡す必要はありません。

その変更を行うことを選択した場合は、単一のList<string>

現在のデザインを維持することを選択した場合は、次の 2 つのクラスが必要になりますproperties

public class SelectedColumns {
    public List<string> displayed { get; set; }
    public List<string> omitted { get; set; }
}
于 2012-12-19T20:12:31.270 に答える