在SQL Server中保存一年中所选月份并在WPF中显示的数据结构[关闭]

问题描述 投票:-1回答:2

我正在使用WPF中的C#,.NET,前端和SQL Server数据库开发软件来定期开发票,而且有些客户不希望在一年中的特定月份开具发票。此发票是定期的,与实际年份无关。发票是从具有某些参数的“合同”对象生成的,以创建定期发票。

当用户创建合同时,理想情况下,他应该看到一年中的每个月都有一个复选框,以取消选中不应开具合同的时间。现在要保存这些用户选择的月份,我需要某种数据结构;在运行时和SQL Server。

听起来我应该使用带有标志的枚举,但我完全坚持这个想法,因为它与XAML不一致(或者我没有经验,也无法让它工作)。我也可以在我的合约对象中每月写一个布尔值,但这似乎是一个愚蠢的想法,或者不是吗?

问题:在SQL Server中,我应该使用什么数据结构来保存用户在运行时选择的月份?

编辑:作为澄清的一个例子:客户可以是学校,学校在7月和8月(我来自哪里)关闭。这几个月不应该开具发票。其他公司可以在不同月份关闭,所以我不能只创建一个布尔'IsSchool'并将其用作过滤器。

c# sql-server wpf enums
2个回答
2
投票

就个人而言,我将它们存放在一个有两列的桥牌表中:UserMonth

除非你从你的问题中留下一些重要的细节,否则我觉得你有点过分思考。

既然不是每个人似乎都能够描绘出我的建议,这里有一个非常简短的例子:

Contract   Month
1          1
1          2
1          3
2          3
2          5
2          7
3          1
3          11
3          12 

可能会有很多行,但如果表被索引,无论多长时间,它都会非常快。


1
投票

你当然可以使用标志来实现这一点。

为了便于说明,我们假设您将复选框的值收集到列表中:

[Flags]
enum MonthsOfYear
{        
    January = 1,
    February = 2,
    March = 4,
    April = 8,
    May = 16,
    June = 32,
    July = 64,
    August = 128,
    September = 256,
    October = 512,
    November = 1024,
    December = 2048
}

public class Months
{
    internal static MonthsOfYear CalculateEnum(List<bool> checkboxes)
    {
        MonthsOfYear value = 0;
        var month = 0;
        for (int i = 0; i < 12; i++)
        {
            month = (i == 0) ? 1 : month * 2;
            if (checkboxes[i])
                value |= (MonthsOfYear)Enum.Parse(typeof(MonthsOfYear), month.ToString());
        }
        return value;
    }

    internal static List<bool> GetFlagsFromEnum(MonthsOfYear value)
    {
        List<bool> checkboxes = new List<bool>();
        var month = 0;
        for (int i = 0; i < 12; i++)
        {
            month = (i == 0) ? 1 : month * 2;
            checkboxes.Add((value & (MonthsOfYear)Enum.Parse(typeof(MonthsOfYear), month.ToString())) != 0);
        }
        return checkboxes;
    }
}

样品用法:

List<bool> checkboxes = new List<bool>() { true, false, true, false, true, false, true, false, true, false, true, false };
Output("Original: ", checkboxes);
var selectionValue = Months.CalculateEnum(checkboxes);
var unpackedCheckboxes = Months.GetFlagsFromEnum(selectionValue);
Output("Unpacked: ", unpackedCheckboxes);        

checkboxes = new List<bool>() { true, true, true, false, false, false, true, true, true, false, false, true};
Output("Original: ", checkboxes);
selectionValue = Months.CalculateEnum(checkboxes);
unpackedCheckboxes = Months.GetFlagsFromEnum(selectionValue);
Output("Unpacked: ", unpackedCheckboxes);

输出:

原文::真,假,真,假,真,假,真,假,真,假,真,假

解包::真,假,真,假,真,假,真,假,真,假,真,假

原文::真,真,真,假,假,假,真,真,真,假,假,真

解包::真,真,真,假,假,假,真,真,真,假,假,真

我几分钟就把它扯出来了。重要的是这个想法。

© www.soinside.com 2019 - 2024. All rights reserved.