【问题标题】:Grid, Datagrid or what?网格、数据网格还是什么?
【发布时间】:2016-02-10 15:21:51
【问题描述】:

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

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

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

更新: 模板

   Project    |  Product  |  Task  |  SubTask

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

【问题讨论】:

  • 是每天每半小时的“经期”吗?你的数据库方案是什么样的?我只是想描绘这个......
  • 主窗口中有一个日历,您可以在其中选择日期。在此之后是网格模板活动 x 期间。当一个时期被一个任务填满时,它就会被记录在数据库中。问题是如何处理空白句点,我是否必须为每一行创建一个 DatagridView 以便这些信息不会被弄乱?
  • 你有没有研究过 ItemsControl 这几乎是一个中继器......

标签: c# wpf datagrid grid


【解决方案1】:

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

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

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

无论您选择什么控件,您仍然有相同的业务需求,并且您选择的控件的 UI 逻辑编码几乎相同。

【讨论】:

    【解决方案2】:

    这是对我所说的内容的一个非常粗略的模拟......

    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>
    

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

    【讨论】:

    • 就可以了。主要的疑问是在 UI 上使用哪个控件以使其对用户更舒适/直观。我的第一个想法是类似的电子表格 excel,所以当双击单元格时会触发编辑模式。这就是为什么我的第一选择是 DataGrid,因为它有适当的事件,但是它在空白期间失败。第二个考虑将我引向了 Grid,但它缺乏适当的事件。现在我正在考虑用填充的句点填充网格,用简单的按钮填充网格......
    • 为什么不使用我的空数据网格答案并禁用处理程序?由于您的任务将是一个列表,只需使用其计数属性并从该行中删除事件...
    • 大多数 UI 元素都可以捕获鼠标移动和/或其他事件,这些事件可以帮助您相应地设置订单项的格式和样式。编码愉快。
    猜你喜欢
    • 2016-07-30
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    相关资源
    最近更新 更多