0

DataGridに表示されているデータがあります。データはSQLから取得され、「money」タイプはnullになる可能性があります。このデータを表示するとき、データを2列形式で通貨としてフォーマットすると、すべて問題ありません。すなわち:

internal void FillGrid(){

        bD = new DataTable();
        DataTable dt = EmployerQuery();  //queries the SQL DB


        bD.Columns.Add(new DataColumn("ID", typeof(int)));
        bD.Columns.Add(new DataColumn("EmployerName", typeof(string)));
        bD.Columns.Add(new DataColumn("FlatMinAmount", typeof(double)));
        bD.Columns.Add(new DataColumn("DistrictRate", typeof(double)));
        bD.Columns.Add(new DataColumn("VendorRate", typeof(double)));
        bD.Columns.Add(new DataColumn("Description", typeof(string)));
        bD.Columns.Add(new DataColumn("EmployeeCount", typeof(int)));

        foreach (DataRow sqlRow in dt.Rows)
        {
            var row = bD.NewRow();
            row["ID"] = sqlRow["ClientID"];
            row["EmployerName"] = sqlRow["OfficialName"];
            row["FlatMinAmount"] = sqlRow["FlatMinAmount"];
            row["DistrictRate"] = sqlRow["DistrictRate"];
            row["VendorRate"] = sqlRow["VendorRate"];
            row["Description"] = sqlRow["Description"];
            row["EmployeeCount"] = sqlRow["EmployeeCount"];

            bD.Rows.Add(row);

        }    

ただし、データを.csvファイルとして保存します。そのファイルを読み返すと、nullであった「FlatMinAmount」の値を列タイプdoubleに挿入できません。そのため、データ列の多くがnullであるため、データ列をタイプdoubleとしてフォーマットできません。

<dg:DataGrid Name="newGrid" ItemsSource="{Binding ElementName=readGrid, Path=readGrid}" AutoGenerateColumns="False"
                 Margin="5" Height="175" Width="Auto" ColumnWidth="Auto">
        <dg:DataGrid.Columns>
            <dg:DataGridTextColumn Binding="{Binding ID}" Header="Employer ID" Width="Auto" IsReadOnly="True"/>
            <dg:DataGridTextColumn Binding="{Binding EmployerName}" Header="Employer Name" Width="Auto" IsReadOnly="True"/>
            <dg:DataGridTextColumn Binding="{Binding FlatMinAmount, StringFormat=C}" Header="FlatMinAmount" Width="Auto" IsReadOnly="True"/>
            <dg:DataGridTextColumn Binding="{Binding DistrictRate, StringFormat=C}" Header="District Rate" Width="Auto" IsReadOnly="True"/>
            <dg:DataGridTextColumn Binding="{Binding VendorRate, StringFormat=C}" Header="Vendor Rate" Width="Auto" IsReadOnly="True"/>
            <dg:DataGridTextColumn Binding="{Binding Description}" Header="Description" Width="Auto" IsReadOnly="True"/>
            <dg:DataGridTextColumn Binding="{Binding EmployeeCount}" Header="EmployeeCount" Width="*" IsReadOnly="True"/>
        </dg:DataGrid.Columns>
    </dg:DataGrid>


DataTable r = new DataTable();

        try
        {
            //string csv = string.Empty;

            //r.Columns.Add("ID", typeof(int));
            //r.Columns.Add("EmployerName", typeof(string));
            //r.Columns.Add("FlatMinAmount",typeof(double));
            //r.Columns.Add("DistrictRate", typeof(double));
            //r.Columns.Add("VendorRate", typeof(double));
            //r.Columns.Add("Description", typeof(string));
            //r.Columns.Add("EmployeeCount", typeof(int));

            r.Columns.Add("ID");
            r.Columns.Add("EmployerName");
            r.Columns.Add("FlatMinAmount");
            r.Columns.Add("DistrictRate");
            r.Columns.Add("VendorRate");
            r.Columns.Add("Description");
            r.Columns.Add("EmployeeCount");

            // Read sample data from CSV file
            using (CsvFileReader reader = new CsvFileReader(filename))
            {
                CsvRow row = new CsvRow();
                while (reader.ReadRow(row))
                {
                    //foreach (string s in row)
                    {
                        r.Rows.Add(row[0], row[1], row[2], row[3], row[4], row[5], row[6]);


                    }

                }
            }

(readGridはコードビハインドでrに設定されます)

文字列の場合、バインディングでStringFormat = Cを使用して$などを表示することはできません。また、DataGridTextColumnのスタイルを設定できないようです。では、.csvから読み込んだ値を$ xx.xxとして表示するにはどうすればよいですか?

4

3 に答える 3

0

数値がnullであることがわかっている場合は、列の値をDBNullに設定するだけでは不十分ですか?

row["FlatMinAmount"] = DBNull.Value;

これが、これが機能していることを示すために実行した小さなコンソールアプリです。

クラスプログラム
    {{
        static void Main(string [] args){
            DataTable tbl = new DataTable();
            DataColumn col = new DataColumn( "Blah"、typeof(double));
            tbl.Columns.Add(col);

            DataRow行=tbl.NewRow();
            row ["Blah"] = DBNull.Value;

            Console.WriteLine( "結果:" + row ["Blah"]。ToString());
            Console.ReadKey();

        }
    }
于 2012-11-07T16:40:30.787 に答える
0

使用Double.Parse()-http ://msdn.microsoft.com/en-us/library/system.double.parse.aspxを使用して、値を読み込んだときに値をフォーマットします。これにより、doubleを使用できるようになり、適切なフォーマットを適用できます。出力用。

更新:ファイルから読み取るnullときに値があり、データベースから読み取るときに値がであるという問題が発生しているようですDBNull。デフォルトでは値DataTableを許可しDBNullます。これを模倣して読む場合は、次のことを試してください

    DataTable r = new DataTable();
    try
    {
        r.Columns.Add("ID");
        r.Columns.Add("EmployerName");
        r.Columns.Add("FlatMinAmount");
        r.Columns.Add("DistrictRate");
        r.Columns.Add("VendorRate");
        r.Columns.Add("Description");
        r.Columns.Add("EmployeeCount");

        // Read sample data from CSV file
        using (CsvFileReader reader = new CsvFileReader(filename))
        {
            CsvRow row = new CsvRow();
            while (reader.ReadRow(row))
            {
                //foreach (string s in row)
                {
                    double d;
                    double? val2 = null;
                    double? val3 = null;
                    double? val4 = null;
                    if (Double.TryParse(row[2], out d)) val2 = d;
                    if (Double.TryParse(row[3], out d)) val3 = d;
                    if (Double.TryParse(row[4], out d)) val4 = d;

                    r.Rows.Add(row[0], row[1], val2, val3, val4, row[5], row[6]);
                }

            }
        }
于 2012-11-07T14:55:59.553 に答える
0

TargetNullValue次の属性を使用します。

<dg:DataGridTextColumn Binding=""{Binding FlatMinAmount,TargetNullValue='Not Specified',StringFormat=C}" Header="FlatMinAmount" Width="Auto" IsReadOnly="True"/>
于 2012-11-07T15:03:07.867 に答える