【问题标题】:''EditItem' is not allowed for this view.' when trying to edit a item in the DataGrid''EditItem' 不允许用于此视图。'尝试编辑 DataGrid 中的项目时
【发布时间】:2018-03-25 18:03:30
【问题描述】:

所以当我双击一个项目来编辑我的数据网格中的值时,我不断收到错误消息。

''EditItem' 不允许用于此视图。'

它看起来像这样

我以前从未遇到过这种情况,所以我不确定该如何处理。 是什么导致了这个问题以及处理这个问题的正确方法是什么,所以我知道将来如何处理它。 我尝试在 Google 上查看它,但它都有列表要做,因为我没有使用列表,所以我看不到与我的应用程序的连接。

XAML

    <DataGrid Name="dgItems">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Property" Binding="{Binding Property}" />
            <DataGridTextColumn Header="Value" Binding="{Binding Value}" />
        </DataGrid.Columns>
    </DataGrid>
</Grid>

CS

private void btnStart_Click(object sender, RoutedEventArgs e)
{
    string path = "";
    OpenFileDialog ofd = new OpenFileDialog();
    ofd.Filter = "Properties | *.properties";
    if (ofd.ShowDialog() == true)
    {
        path = ofd.FileName;
    }
    using (StreamReader sr = new StreamReader(path))
    {
        string line;
        while ((line = sr.ReadLine()) != null)
        {
            if (!line.StartsWith("#"))
            {
                string[] lines = line.Split('=');
                string property = lines[0];
                string value = lines[1];
                this.dgItems.Items.Add(new ServerProperties { Property = property, Value = value });
                Debug.Print($"Property: {property} Value: {value}");
            }
        }
    }
}

获取和设置值的我的类

public class ServerProperties
{
    public string Property { get; set; }
    public string Value { get; set; }
}

【问题讨论】:

    标签: c# .net wpf datagrid


    【解决方案1】:

    您应该将DataGridItemsSource 属性设置为实现IList 接口的集合,以便您能够编辑项目:

    var list = new List<ServerProperties> { ... };
    dgItems.ItemsSource = list;
    

    不要将任何项目直接添加到DataGridItems 属性:

    dgItems.Items.Add(new ServerProperties());
    

    所以你应该稍微修改你的代码:

    private void btnStart_Click(object sender, RoutedEventArgs e)
    {
        string path = "";
        OpenFileDialog ofd = new OpenFileDialog();
        ofd.Filter = "Properties | *.properties";
        if (ofd.ShowDialog() == true)
        {
            path = ofd.FileName;
        }
        List<ServerProperties> serverProperties = new List<ServerProperties>();
        using (StreamReader sr = new StreamReader(path))
        {
            string line;
            while ((line = sr.ReadLine()) != null)
            {
                if (!line.StartsWith("#"))
                {
                    string[] lines = line.Split('=');
                    string property = lines[0];
                    string value = lines[1];
                    serverProperties.Add(new ServerProperties { Property = property, Value = value });
                    Debug.Print($"Property: {property} Value: {value}");
                }
            }
        }
        dgItems.ItemsSource = serverProperties;
    }
    

    【讨论】:

    • 哦,这就是数据网格的工作原理!您需要使用列表填充它们,然后您可以更改该列表!这是有道理的!
    • 但是还有保存新值的问题 是否有一个我可以玩的项目更改时的事件?
    • 当一个属性被设置为一个新值时,它的设置器被调用。所以你可以在那里做任何你想做的事情,例如发起一个事件。
    • 当一个属性被设置为一个新值时,它的设置器被调用你的意思是,每次我改变一个值时,它都会“重新加载”ClickEvent?
    • 没有。您到底想保存什么时间?每次编辑单元格后保存没有意义。
    猜你喜欢
    • 2011-10-20
    • 2017-04-26
    • 1970-01-01
    • 2013-09-05
    • 2013-11-30
    • 2012-01-30
    • 2017-04-10
    • 2011-09-13
    相关资源
    最近更新 更多