1 Востаннє редагувалося spamua (24.03.2014 18:43:45)

Тема: Робота з DataGrid(wpf)

За допомогою Entity було створоне модель бд  з таким представленням потрібної мені таблиці

public partial class Dictionary
    {
        public int ID { get; set; }
        public string Word { get; set; }
        public string Translation { get; set; }
    
        public virtual MyWords MyWords { get; set; }

        public static List<Dictionary> SelectComand()
        {
            var load = bd.Dictionary.ToList();
            return load;
        }
    }

Далі витягую дані з БД ,завантажую їх в колекцію і виводжу в DataGrid (dg)

 List<Dictionary> dictionary = new List<Dictionary>();
 dictionary = Dictionary.SelectComand();

private void ButtonDView_Click(object sender, RoutedEventArgs e)
        {
            var dictable = from dic in dictionary select new { dic.ID, dic.Word, dic.Translation };
            dg.ItemsSource = dictable;
        }

В даному прикладі в свій DataGrid я передаю зразу "масив" обєктів і на їх основі DataGrid формує 3 колонки (ID,Word,Translation)....скажіть будь ласка як  самому обирати кількість,назву колонок і самому вибирати  в яку колонку записувати   дані?

2

Re: Робота з DataGrid(wpf)

з того що я за 10 хвилин знайшов в гуглі, накидав 2 екземли простіший і чучуть складніший

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

        }

        public class ResourceEmulator
        {
            public const string ID_TEXT = "Номер";
            public const string NAME_TEXT = "Назва";
            public const string Quantity_Text = "Кількість";
        }

        public class GridViewModel
        {
            [DisplayName(ResourceEmulator.ID_TEXT)]
            public int Id { get; set; }

            [DisplayName(ResourceEmulator.NAME_TEXT)]
            public string Name { get; set; }

            [DisplayName(ResourceEmulator.Quantity_Text)]
            public string Quantity { get; set; }

        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {

            List<dynamic> list = new List<dynamic> { new {Id = 1, Name = "qqq", q = 3}, new {Id = 2, Name = "zzz", q = 5}};
            dg.ItemsSource = list.Where(i => i.Id > 1).Select(i => new { Neym = i.Name, quantity = i.q});
            dg.Columns[0].Header = "Нейм";
            dg.Columns[1].Header = "Квантіті";

            dg2.ItemsSource = list.Select(i => new GridViewModel { Id = i.Id, Name = i.Name, Quantity = i.q.ToString() });
        }

        private void dg2_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string displayName = GetPropertyDisplayName(e.PropertyDescriptor);
            if (!string.IsNullOrEmpty(displayName))
            {
                e.Column.Header = displayName;
            }
        }

        public static string GetPropertyDisplayName(object descriptor)
        {

            PropertyDescriptor pd = descriptor as PropertyDescriptor;
            if (pd != null)
            {
                // Check for DisplayName attribute and set the column header accordingly
                DisplayNameAttribute displayName = pd.Attributes[typeof(DisplayNameAttribute)] as DisplayNameAttribute;
                if (displayName != null && displayName != DisplayNameAttribute.Default)
                {
                    return displayName.DisplayName;
                }

            }
            else
            {
                PropertyInfo pi = descriptor as PropertyInfo;
                if (pi != null)
                {
                    // Check for DisplayName attribute and set the column header accordingly
                    Object[] attributes = pi.GetCustomAttributes(typeof(DisplayNameAttribute), true);
                    for (int i = 0; i < attributes.Length; ++i)
                    {
                        DisplayNameAttribute displayName = attributes[i] as DisplayNameAttribute;
                        if (displayName != null && displayName != DisplayNameAttribute.Default)
                        {
                            return displayName.DisplayName;
                        }
                    }
                }
            }
            return null;
        }
    }

3

Re: Робота з DataGrid(wpf)

На WindowsForms робив так:

 MessageBox.Show(dataGridView1.CurrentRow.Cells[1].Value.ToString());

як добитись цього в WPF ?  опції CurrentRow тут немає!

4

Re: Робота з DataGrid(wpf)

наскільки я зрозумів грід у впф набагато продвинутіший ніж у формах і в нього можна засунути багато речей окрім тексту, але через це стало складніше робити на перший погляд прості речі. Якшо у вас в комірці простий текст і якщо у вас в гріді такі настройки як буде показано нижче то значення комірки можна отримати так.

private void Button_Click(object sender, RoutedEventArgs e)
        {
            dg2.SelectionMode = DataGridSelectionMode.Single;
            dg2.SelectionUnit = DataGridSelectionUnit.Cell;

            if (dg2.SelectedCells.Any())
            {
                var cellinfo = dg2.SelectedCells[0];
                var textblock = cellinfo.Column.GetCellContent(cellinfo.Item) as TextBlock;
                if (textblock != null)
                {
                    MessageBox.Show(textblock.Text);
                }
            }
        }
Подякували: spamua1