2013-09-23 125 views
1

我在Wpf DataGrid. I am adding values in datagrid's first column called Model Name中遇到問題。下面我也給我的代碼來展示這個問題。DataGrid不允許編輯項目

所以我的問題是第一列將顯示來自數據庫的值,其他列可以是可寫的。所有的值將保存在某個數據庫表中。當我使用datagrid.Items.Add(data);那麼它給出了第一列中的值,工作正常,但如果我開始在其他列寫它給人錯誤

「Edititem是不允許的」。

這是我在WPF代碼

 <DataGrid HorizontalAlignment="Center" 
        Name="DeliveryGrid" IsReadOnly="False" 
        AutoGenerateColumns="False" 
        LoadingRow="DataGrid_LoadingRow" 
        Margin="0,85,0,0" 
        VerticalAlignment="Top" 
        Height="235" 
        Width="462"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Model" Width="90" Binding="{Binding ModelName}" x:Name="ModelName" /> 
       <DataGridTextColumn Header="Engine No" Width="90" x:Name="EngineNo" /> 
       <DataGridTextColumn Header="Chasis No" Width="90" x:Name="ChasisNo" /> 
       <DataGridTextColumn Header="Authority No" Width="90" x:Name="AuthorityNo" /> 
       <DataGridTextColumn Header="Price" x:Name="Price" /> 
      </DataGrid.Columns> 
     </DataGrid> 

這裏是我的C#代碼

public class BikesOrderObjects 
    { 
     public string ModelName { get; set; } 
     public int ModelID { get; set; } 
     public string BEngineNo { get; set; } 
     public string BChasisNo { get; set; } 
     public string BAuthorityNo { get; set; } 
     public double Price { get; set; } 
     public int qty { get; set; } 
    } 

private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 
      RST_DBDataContext conn = new RST_DBDataContext(); 
      LoadDeliveryData(); 

     } 

     private void LoadDeliveryData() 
     { 
      RST_DBDataContext conn = new RST_DBDataContext(); 
      var BikesOrderData = conn.TblBikesOrdersDetails 
       .Where(TblBikesOrdersDetail => TblBikesOrdersDetail.BOId == 1) 
          .Select(TblBikesOrdersDetail => new 
          { 
           qty = TblBikesOrdersDetail.BQty, 
           ModelID = TblBikesOrdersDetail.ModelId, 
           ModelName = TblBikesOrdersDetail.TblBikeModel.ModelName 
          }); 
      foreach (var item in BikesOrderData) 
      { 
       for (int i = 0; i < item.qty; i++) 
       { 
        var data = new BikesOrderObjects { ModelName = item.ModelName }; 
        DeliveryGrid.Items.Add(data); 
       } 


      } 


     } 
+0

你可以分享BikesOrderObjects代碼? – Nitin

+0

@nit謝謝!我現在提供 –

+0

你是單向約束第一列,是否有一個原因,你沒有約束其他列? – 2013-09-23 06:06:37

回答

2

should not update the Items直接在DataGrid而是集ItemsSource到實現IEditableCollectionView接口集合以允許編輯。該界面具有功能EditItems(),可以進行編輯。

所以爲了解決這個問題。創建ObservableCollection<BikesOrderObjects>財產在你的窗口說MyBikesOrders並綁定到DataGrid ItemsSource

<DataGrid HorizontalAlignment="Center" ItemsSource="{Binding MyBikesOrders}"/> 

假設你有你的窗口DataContext設置爲自身。

在您的構造函數中,您可以通過新建它來初始化此集合,並在LoadDeliveryData方法中將該對象添加到此集合中。

+0

沒錯。另外,請確保您沒有爲此使用'LoadingRow'事件。應用@nit的建議後,請刪除使用'LoadingRow'。 –

+0

感謝@nit,我是wpf c#的新手,請給我一個簡短的例子,讓我覺得不那麼容易理解。謝謝! –

+0

正如答案中所解釋的,只需在codebehind中創建類型爲observablecollection的屬性並將其綁定到Datagrid即可。並直接更新此屬性而不是項目。這將更新您的DataGrid並允許編輯 – Nitin

0

我得到了解決辦法,這裏是我的代碼

 private void LoadDeliveryData() 
     { 
      RST_DBDataContext conn = new RST_DBDataContext(); 
      var BikesOrderData = conn.TblBikesOrdersDetails 
       .Where(TblBikesOrdersDetail => TblBikesOrdersDetail.BOId == 1) 
          .Select(TblBikesOrdersDetail => new 
          { 
           qty = TblBikesOrdersDetail.BQty, 
           ModelID = TblBikesOrdersDetail.ModelId, 
           ModelName = TblBikesOrdersDetail.TblBikeModel.ModelName 
          }); 
      List<BikesOrderObjects> data = new List<BikesOrderObjects>(); 
      foreach (var item in BikesOrderData) 
      { 

       for (int i = 0; i < item.qty; i++) 
       { 
        BikesOrderObjects datae = new BikesOrderObjects(); 
        datae.ModelName = item.ModelName; 
        data.Add(datae); 
       } 

      } 

      DeliveryGrid.ItemsSource = data; 

     }