Search code examples
c#wpfdatagrid

unable to send selected rows of datagrid into database but send text of System.Windows.Controls.TextBlock


I want to select rows of Data-grid into DemoTest in SQL it has no error in starting it but as i check the table in SQL i see the text showed in image. it doesn't send the data in the DataGrid but it send the code system.Windows.Controls.TextBlock

using GetCellContent is wrong? or should i

using WPF Entity FrameWork.

private void btn_SendWorkOrder_Click(object sender, RoutedEventArgs e) 

        {


        DemoTest Dtest = new DemoTest();
        CheckBox mChkBox = new CheckBox();


        for (int i = 0; i < DataGridInsRep.Items.Count - 1; i++)
            {

            mChkBox = DataGridInsRep.Columns[0].GetCellContent(DataGridInsRep.Items[i]) as CheckBox;

            if (mChkBox.IsChecked == true)
                {

                Dtest.MCode = Convert.ToString(DataGridInsRep.Columns[2].GetCellContent(DataGridInsRep.Items[i]));
                Dtest.MName = Convert.ToString(DataGridInsRep.Columns[3].GetCellContent(DataGridInsRep.Items[i]));

                Dtest.McName = Convert.ToString(DataGridInsRep.Columns[5].GetCellContent(DataGridInsRep.Items[i]));
                Dtest.PDesc = Convert.ToString(DataGridInsRep.Columns[6].GetCellContent(DataGridInsRep.Items[i]));
                //Dtest.McCode = Convert.ToInt32(DataGridInsRep.Columns[4].GetCellContent(DataGridInsRep.Items[i]));
                database.DemoTests.Add(Dtest);

                }

            }
        database.SaveChanges();

        MessageBox.Show("may check it");
        }

enter image description here


Solution

  • It happens because

    DataGridInsRep.Columns[2].GetCellContent(DataGridInsRep.Items[i]) 
    

    returns the Column Content which is internally TextBlock (if not override by Cell Template).

    Change the code to

    var codeTextBlock = DataGridInsRep.Columns[2].GetCellContent(DataGridInsRep.Items[i]) as TextBlock;
    
    Dtest.MCode = codeTextBlock.Text;
    

    You should do it for other properties.

    However, another perspective here is that why are you fetching the data like this. If the DataGrid's ItemSource is bound to Collection of class, then following code is more readable:

    var itemsSource = DataGridInsRep.ItemsSource as IEnumerable;
    if (itemsSource != null)
    {
        foreach (var item in itemsSource.OfType<YourClass>())
        {
            Dtest.MCode = item.MCode;
            //...
        }
    }