[WPF](小結2)DataGrid嵌套DataGrid(也叫主從表)


DataGrid嵌套DataGrid(也叫主從表),效果為:單擊表中某項后,從中間展開一個新表,總表綁定的是題目類大集合,從表綁定的是對應的選項集合.
第一:選構建題目類,再建一個選項類,題目類集合中的每個項包含一個選項類集合,即數組嵌套數組,C#語句如下:
(為方便看清語句,類直接寫在主程序中)
C#代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections .ObjectModel ;//ObservableCollection命名空間
namespace DataGridInDataGrid
{
    /// <summary>
    /// MainWindow.xaml 的交互邏輯
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
                //題目類
        class question
        {
            public Int32 questionID//題目ID號
            { get; set; }
            public string questionName//題目名,比如:第1題或第2題等
            { get; set; }
            public ObservableCollection<choseItem> choseItems//某題中"選項類"的集合,比如A-D
            { get; set; }
            public question(Int32 _id, string _questionname, ObservableCollection<choseItem> _choseitems)//構造函數
            {
                questionID =_id ;
                questionName = _questionname;
                choseItems = _choseitems;
            }
        }
        //選項類
        class choseItem
        {
            public string ChoseName//選項名,比如:A,B,C,D之類
            { get; set; }
            public string ChoseContent//選項內容
            { get; set; }
        }
        ObservableCollection<question> Questions = new ObservableCollection<question>();//題目數組
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
                    string[] CharStr = new string[4] { "A", "B", "C", "D" };
            for (int i = 0; i < 5; i++)
            {
                ObservableCollection<choseItem> ChoseItems = new ObservableCollection<choseItem>();//選項數組               
                for (int j = 0; j < 4; j++)
                {
                    choseItem item = new choseItem();//選項類
                    item.ChoseName = CharStr[j] + ":";
                    item.ChoseContent = "選項內容舉例...";
                    ChoseItems.Add(item);
                }
                Questions.Add(new question(i,"__第" + (i + 1).ToString() + "", ChoseItems));
            }
            datagrid1.ItemsSource = Questions;
        }
    }
}

第二步:主界面的綁定語句如下:

主界面代碼
<Window x:Class="DataGridInDataGrid.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="DataGridInDataGrid" Height="350" Width="525" Loaded="Window_Loaded">
    <Grid>
        <DataGrid AutoGenerateColumns="False" Name="datagrid1">
            <DataGrid.Columns>
                <DataGridTextColumn Header="ID值" IsReadOnly="True" Width="auto" Binding="{Binding questionID}" />
                <DataGridTextColumn Header="題目" IsReadOnly="True" Width="auto" Binding="{Binding questionName}" />
            </DataGrid.Columns>
            <DataGrid.RowDetailsTemplate >
                <DataTemplate >
                    <DataGrid ItemsSource="{Binding choseItems}" AutoGenerateColumns="False"
                              Margin="30,20,0,20"  Background="Green">
                        <DataGrid.Columns>
                            <DataGridTextColumn Header="選項名" Binding="{Binding ChoseName}" />
                            <DataGridTextColumn Header="選項內容舉例" Binding="{Binding ChoseContent}"/>
                        </DataGrid.Columns>
                    </DataGrid>                    
                </DataTemplate>
            </DataGrid.RowDetailsTemplate>
        </DataGrid>
    </Grid>
</Window>
第三:小結一下
1:表嵌套表也叫主從表,主要用到了DataGrid.RowDetailsTemplate 行詳細模板,
2:要注意被嵌套的表要設置好margin值,要不然一點開會很突然,用戶都搞不懂在顯示什么,


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM