学习任重道远啊 2024-05-08 09:29 采纳率: 65.2%
浏览 55

DataGrid控件单元格内容显示不出来

wpf中DataGrid控件问题

数据绑定的代码

<DataGrid x:Name="dataGrid1" 
          AutoGenerateColumns="True" 
          CanUserAddRows="False"
          CanUserSortColumns="False" 
          SelectionUnit="Cell" 
          PreviewKeyDown="dataGrid1_PreviewKeyDown" 
          ItemsSource="{Binding dataGridData}"/>

viewmodel代码

private DataView _dataGridData;
public DataView dataGridData {
    get { return _dataGridData; }
    set {
        if (_dataGridData != value) {
            _dataGridData = value;
            OnPropertyChanged(nameof(dataGridData));
            //RaisePropertyChanged("dataGridData");//当字段改变时就通知
        }
    }
}

然后有个初始化界面的代码

public void initdataGrid()
{
dataGridColumn.Add(名称);
string str1 = string.Format("{0}[GHz|Lin]", Freq);
dataGridColumn.Add(str1);
string str2 = string.Format("{0}[dBm|Lin]", 输入);
dataGridColumn.Add(str2);
string str3 = string.Format("{0}[dBm|Lin]", 输出);
dataGridColumn.Add(str3);
DataTable dt = new DataTable();
for (int i = 0; i < dataGridColumn.Count; i++) {
    dt.Columns.Add(dataGridColumn[i], typeof(string));
}

int dataGridSn = 0;
for (int i = 0; i < 1; i++) {
    dataGridSn++;
    List<string> strs = new List<string>();
    strs.Add(dataGridSn.ToString());
    for (int ii = 1; ii < dataGridColumn.Count; ii++) {
        strs.Add("--");
    }
    dataGridRow.Add(strs);
}

for (int i = 0; i < dataGridRow.Count; i++) {
    object?[] rowValues = new object?[dataGridColumn.Count];
    for (int j = 0; j < dataGridRow[i].Count; j++) {
        rowValues[j] = dataGridRow[i][j];
    }
    dt.Rows.Add(rowValues);
}
this.dataGridData = dt.DefaultView;
}



然后初始化界面后,除了名称那一列的所有内容能显示出来,其他的列的内容都没在控件上显示,但是我自己调试抓取,控件上是有内容的,因此想请教一下,这个是个啥情况,是否可以解决?

显示图片

img

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-05-08 09:29
    关注

    引自免费微信小程序:皆我百晓生

    根据您提供的信息,看起来您的WPF DataGrid 控件在尝试展示来自 DataTable 的数据时遇到了问题。问题在于,虽然您已经将数据添加到了 DataTable 中,并设置了 ItemsSourcedataGridData,但某些列的内容没有正确显示。这可能是因为数据类型的不匹配或者格式化问题。

    首先,让我们检查一下数据源。您的 DataTable 包含了整数类型的 dataGridSn 和字符串类型的其他列。然而,在创建 DataTable 列时,所有列都被指定为 typeof(string) 类型。这可能会导致整数类型的 dataGridSnDataGrid 中无法正确显示。

    为了修复这个问题,我们需要确保列类型与数据类型相匹配。下面是一个修改后的初始化方法,它会根据实际数据类型动态地设置列类型:

    public void InitDataGrid()
    {
        dataGridColumn.Add("名称");
    
        string str1 = string.Format("{0}[GHz|Lin]", Freq);
        dataGridColumn.Add(str1);
        string str2 = string.Format("{0}[dBm|Lin]", InputPower);
        dataGridColumn.Add(str2);
        string str3 = string.Format("{0}[dBm|Lin]", OutputPower);
        dataGridColumn.Add(str3);
    
        DataTable dt = new DataTable();
    
        // 添加列并根据实际数据类型设置列类型
        foreach (var col in dataGridColumn)
        {
            if (col == "名称")
            {
                dt.Columns.Add(col, typeof(int)); // 假设名称是整数类型
            }
            else
            {
                dt.Columns.Add(col, typeof(string));
            }
        }
    
        for (int i = 0; i < 1; i++)
        {
            dataGridSn++;
            List<string> strs = new List<string>();
            strs.Add(dataGridSn.ToString()); // 将整数转换为字符串
            for (int ii = 1; ii < dataGridColumn.Count; ii++)
            {
                strs.Add("--");
            }
            dataGridRow.Add(strs);
        }
    
        for (int i = 0; i < dataGridRow.Count; i++)
        {
            object?[] rowValues = new object?[dataGridColumn.Count];
            for (int j = 0; j < dataGridRow[i].Count; j++)
            {
                rowValues[j] = dataGridRow[i][j];
            }
            dt.Rows.Add(rowValues);
        }
    
        this.dataGridData = dt.DefaultView;
    }
    

    这里我们假设 "名称" 列是整数类型(因为你在调试时看到的是整数值)。如果你的实际数据不同,请相应调整列类型的判断条件。

    此外,确保您的ViewModel类实现了INotifyPropertyChanged接口,并且OnPropertyChanged方法被正确调用,这样当数据变化时,UI才会更新。确保ViewModel类有以下实现:

    using System.ComponentModel;
    
    public class YourViewModel : INotifyPropertyChanged
    {
        private DataView _dataGridData;
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    
        public DataView DataGridData
        {
            get => _dataGridData;
            set
            {
                if (_dataGridData != value)
                {
                    _dataGridData = value;
                    OnPropertyChanged(nameof(DataGridData));
                }
            }
        }
    
        // 其他代码...
    }
    

    完成上述更改后,应该可以正常显示所有列的内容。如果仍然存在问题,请检查其他可能的原因,例如数据绑定路径、视图模型属性名称与XAML中的名称是否完全一致等。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 5月8日
  • 创建了问题 5月8日