Grid,Datagrid还是什么?

时间:2016-02-10 15:21:52

标签: c# wpf datagrid grid

我正在尝试取消链接到数据库的任务列表调度程序。根据任务组,每个任务作为特定依赖项,此路径取决于数据库关系。

WPF表单包含每行工作时间(30分钟)的模板。在初始化时,表单应该读取数据库,查找当天的条目并在正确的行(句点)中填充它们。

我的问题是,对于这种情况,哪种解决方案最好?我将需要分隔为模板的行(30m句点),即使它们是空白的,也需要OnDoubleClick类似的事件来触发任务条目。

更新: 模板

   Project    |  Product  |  Task  |  SubTask

07:30
08:00 XXXX XXXX XXXX XXXX
08:30

2 个答案:

答案 0 :(得分:1)

首先尝试创建线框,并从用户的角度看看更有意义的内容。创建线框后,我会创建一个简单的原型并针对您的用户进行测试,以便您能够知道每个控件的优缺点。其次,除了获得为特定任务构建的内置控件之外,使用Grid,DataGrid或其他控件之间确实没有区别。

控件是否满足您的要求?你不知道,在你创建它之前没有人做过,测试和验证它。

在我看来,如果你有一个非常大的数据集,那么DataGrid将节省你的时间,因为控件已经为你提供了处理它们的解决方案。如果您使用网格或自定义控件,那么您必须自己处理它。

无论您选择何种控件,您仍然可以拥有相同的业务要求,并且对于您选择的控件,UI逻辑的编码几乎相同。

答案 1 :(得分:0)

这是一个非常粗略的模仿我正在谈论的内容......

public partial class MainWindow : Window
{
    public List<Schedule> _schedules { get; set; }
    List<MyTask> _dbContext = new List<MyTask>();
    public MainWindow()
    {
        InitializeComponent();
        _schedules = new List<Schedule>();
        LoadTimeIntervals(DateTime.Now);
        LoadDbContext();
        LoadTasks();

        DataContext = this;
    }

    private void LoadTimeIntervals(DateTime selectedDate)
    {
        var starting = DateTime.Parse(selectedDate.Date.ToShortDateString() + " 00:00:00");

        for (var i = starting; i < DateTime.Parse(selectedDate.Date.ToShortDateString() + " 23:59:00"); i += new TimeSpan(0, 30, 0))
        {
            _schedules.Add(new Schedule() { TaskDT = i, Tasks = new List<MyTask>() });
        }
    }

    private void LoadTasks()
    {
        foreach (var interval in _schedules)
        {
            interval.Tasks = _dbContext.Where(x => x.DueDt == interval.TaskDT).ToList();
        }
    }

    private void LoadDbContext()
    {
        for (int i = 1; i < 24; i++)
        {
            if ((i & 1) == 0)
                _dbContext.Add(new MyTask() { DueDt = DateTime.Parse(DateTime.Now.Date.ToShortDateString() + " " + i.ToString().PadLeft(2, '0') + ":00:00"), Name = "Task #" + i.ToString(), Completed = false });
        }

        for (int i = 1; i < 24; i++)
        {
            if ((i & 1) == 0)
                _dbContext.Add(new MyTask() { DueDt = DateTime.Parse(DateTime.Now.Date.ToShortDateString() + " " + i.ToString().PadLeft(2, '0') + ":00:00"), Name = "Task #" + i + 24, Completed = false });
        }
    }


}

public class Schedule
{
    public DateTime TaskDT { get; set; }
    public List<MyTask> Tasks { get; set; }

}

public class MyTask
{
    public DateTime DueDt { get; set; }
    public string Name { get; set; }
    public bool Completed { get; set; }
}

和XAML ......

<Grid>
    <ItemsControl ItemsSource="{Binding _schedules}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Vertical" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding TaskDT}" Margin="3" />
                    <ItemsControl ItemsSource="{Binding Tasks}">
                        <ItemsControl.ItemsPanel>
                            <ItemsPanelTemplate>
                                <StackPanel Orientation="Vertical" />
                            </ItemsPanelTemplate>
                        </ItemsControl.ItemsPanel>
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <TextBlock Text="{Binding Name}" Margin="3" />
                                    <TextBlock Text="{Binding DueDt, StringFormat={}Due: {0}}" Margin="3" />
                                    <CheckBox IsChecked="{Binding Completed}" Content="Status:" Margin="3" />
                                </StackPanel>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

再次,这是一个粗略的模拟和分钟。风格和功能。已经完成,但你可以看到这是如何开始的。如果您需要样式方面的帮助,请告诉我,我可以发布更多代码来帮助您。