rc89994 Ответов: 3

Как получить данные из WPF datagrid в datatable


Привет,

Я переношу код из windows forms в WPF.

в windows forms код выглядит следующим образом:
Datatable dt= datagrid1.Источником данных объекта DataTable

Может ли кто-нибудь помочь мне, на что он будет мигрировать в WPF.
Я попробовал с
Datatable dt= datagrid1.Что ItemsSource в качестве объекта DataTable

Но я получаю dt=null

Sergey Alexandrovich Kryukov

Взгляните на это: http://www.codeproject.com/Questions/235997/insert-datagridview-to-database". Вы из одной и той же школы получаете одно и то же задание. Ваш вопрос лучше... :-).
--СА

Pete O'Hanlon

Теперь это заставило меня рассмеяться. Овации.

3 Ответов

Рейтинг:
21

derinpdavis

то, что вы назначили datagrid1.ItemsSource, вы получаете то же самое обратно.

если вы не уверены, что получаете обратно, то назначьте его объекту "var" и проверьте тип

var abc = datagrid1.ItemsSource;

if(abc!=null)
{
 MessageBox.Show(abc.GetType().Name);
}


Habibur Rony

Спасибо.

wwwx

ЭТО РАБОТАЕТ!

Рейтинг:
1

Faztrick Fazil Pv

мое новое решение




public DataTable DataGridtoDataTable(DataGrid dg)
        {

            DataTable dt = new DataTable();

            for (int i = 0; i <= dg.Columns.Count - 1; i++)
            {
                dt.Columns.Add(dg.Columns[i].Header.ToString(), typeof(string));
            }
            DataRow Row;

            for (int i = 0; i <= dg.Items.Count - 1; i++)
            {
                Row = dt.NewRow();

                for (int k = 0; k <= dg.Columns.Count - 1; k++)
                {
                    Row[dg.Columns[k].Header.ToString()] = gettabelcell(i, k,dg);

                }
                dt.Rows.Add(Row);
            }

            return dt;

        }

public String gettabelcell(int x, int y,DataGrid dg)
        {
            try
            {
                String myString = dg.GetCell(x, y).ToString();

                if (myString.Contains(":"))
                {
                    String[] s = myString.Split(':');
                    String item = s[1];
                    return item.Trim();
                }
                else
                {
                    return "";
                }
            }
            catch
            {
                return "";
            }
        }



этот класс

static class ExtensionHelpers
   {

       public static T GetVisualChild<T>(Visual parent) where T : Visual
       {
           T child = default(T);
           int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
           for (int i = 0; i < numVisuals; i++)
           {
               Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
               child = v as T;
               if (child == null)
               {
                   child = GetVisualChild<T>(v);
               }
               if (child != null)
               {
                   break;
               }
           }
           return child;
       }

       public static DataGridCell GetCell(this DataGrid grid, int row, int column)
       {
           DataGridRow rowContainer = grid.GetRow(row);
           return grid.GetCell(rowContainer, column);
       }
       public static DataGridRow GetSelectedRow(this DataGrid grid)
       {
           return (DataGridRow)grid.ItemContainerGenerator.ContainerFromItem(grid.SelectedItem);
       }
       public static DataGridRow GetRow(this DataGrid grid, int index)
       {
           DataGridRow row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index);
           if (row == null)
           {
               // May be virtualized, bring into view and try again.
               grid.UpdateLayout();
               grid.ScrollIntoView(grid.Items[index]);
               row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index);
           }
           return row;
       }

       public static DataGridCell GetCell(this DataGrid grid, DataGridRow row, int column)
       {
           if (row != null)
           {
               DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row);

               if (presenter == null)
               {
                   grid.ScrollIntoView(row, grid.Columns[column]);
                   presenter = GetVisualChild<DataGridCellsPresenter>(row);
               }

               DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
               return cell;
           }
           return null;
       }
   }


CHill60

Пожалуйста, не публикуйте несколько решений одного и того же вопроса. Это сбивает с толку и делает вас похожим на охотника за рептилиями. Вы должны либо использовать ссылку "улучшить решение" рядом с вашим оригинальным постом (однако, через 6 лет я не уверен, сколько это добавит ценности), либо, если вы так отчаянно хотите получить это там, подумайте о том, чтобы написать его в качестве подсказки

Рейтинг:
0

Faztrick Fazil Pv

public static DataTable DataGridtoDataTable(DataGrid dg)
        {
          
          
            dg.SelectAllCells();
            dg.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader;
            ApplicationCommands.Copy.Execute(null, dg);
            dg.UnselectAllCells();
            String result = (string)Clipboard.GetData(DataFormats.CommaSeparatedValue);
            string[] Lines = result.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);
            string[] Fields;
            Fields = Lines[0].Split(new char[] { ',' });
            int Cols = Fields.GetLength(0);
            DataTable dt = new DataTable();
            //1st row must be column names; force lower case to ensure matching later on.
            for (int i = 0; i < Cols; i++)
                dt.Columns.Add(Fields[i].ToUpper(), typeof(string));
            DataRow Row;
            for (int i = 1; i < Lines.GetLength(0)-1; i++)
            {
                Fields = Lines[i].Split(new char[] { ',' });
                Row = dt.NewRow();
                for (int f = 0; f < Cols; f++)
                {
                    Row[f] = Fields[f];
                }
                dt.Rows.Add(Row);
            }
            return dt;
            
        }



проверить это


CHill60

ОП надеюсь не ждал решения 2 с половиной года

Member 10517530

Это было забавно...

Ronny_jair

Привет, чтобы быть желающим работать в любом случае, поместите код sigueinte в начало : dg.SelectionMode = DataGridSelectionMode.Расширенный ;
Кроме того, когда столбец является combobox , я не хочу , чтобы он тогда появлялся ID combobox, но текст, есть идеи?

с уважением