2013-09-23 78 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; 

     }