C# DataGridView在分配给包含内部属性的类型列表时显示空行
我遇到了一个问题,它与我关于访问修饰符的基本C#概念相矛盾。因此,我构建了一个示例应用程序来再现相同的场景 有一个带有Click按钮的父窗体,在该窗体的事件上会生成一个带有DataGridView的新窗体。数据源是静态字符串,字符串和属性是内部的,因为我在同一个项目中使用所有内容 令我惊讶的是,由于有5个数据项绑定到该网格,所以生成了5行,但都是空行。然后我把这些财产公之于众,并且我能够得到它们。第二次使用正确的数据填充所有行 父表单C# DataGridView在分配给包含内部属性的类型列表时显示空行,c#,winforms,C#,Winforms,我遇到了一个问题,它与我关于访问修饰符的基本C#概念相矛盾。因此,我构建了一个示例应用程序来再现相同的场景 有一个带有Click按钮的父窗体,在该窗体的事件上会生成一个带有DataGridView的新窗体。数据源是静态字符串,字符串和属性是内部的,因为我在同一个项目中使用所有内容 令我惊讶的是,由于有5个数据项绑定到该网格,所以生成了5行,但都是空行。然后我把这些财产公之于众,并且我能够得到它们。第二次使用正确的数据填充所有行 父表单 namespace SampleApp{ public pa
namespace SampleApp{
public partial class Form1 : Form
{
List<ItemModel> modelList = new List<ItemModel>();
public Form1()
{
InitializeComponent();
}
private void btnClick_Click(object sender, EventArgs e)
{
LoadData();
using (SeperateWindow window = new SeperateWindow(modelList))
{
window.PopulateGrid();
if(window.ShowDialog() == DialogResult.OK)
{
}
}
}
public void LoadData()
{
for(int i= 0; i < 5; i++)
{
ItemModel item = new ItemModel($"Name { i}", i.ToString());
modelList.Add(item);
}
}
}
包含GridView的子表单
namespace SampleApp.Model{
public partial class SeperateWindow : Form
{
List<ItemModel> _modelList = new List<ItemModel>();
internal SeperateWindow(List<ItemModel> modelList)
{
_modelList = modelList;
InitializeComponent();
}
public void PopulateGrid()
{
dataGridView1.DataSource = _modelList;
}
}
namespace SampleApp.Model{
公共部分类单独窗口:窗体
{
列表_modelList=新列表();
内部单独窗口(列表模型列表)
{
_模型列表=模型列表;
初始化组件();
}
public void PopulateGrid()
{
dataGridView1.DataSource=\u modelList;
}
}
我的问题是,既然所有内容都在同一个项目中,并且模型类和子表单也在同一个文件夹中,那么为什么我会得到空行呢?如果我将它们公开,它工作正常。From
用作绑定的绑定源属性的属性必须是类的公共属性。不能为绑定目的访问显式定义的接口属性,也不能访问没有基本实现的受保护、私有、内部或虚拟属性
另请参阅,其中讨论了数据绑定中的
public
和internal
关键字之间的区别。这是一个很好的见解。这都是由于绑定引擎和PresentationFramework.dll绑定,因此无法访问属性。但在这种情况下,它不应该给出运行时异常吗?@priyankbhardwaj检查输出窗口。如果有,它应该在那里。我已经检查过了,O/P窗口中没有任何内容。
namespace SampleApp.Model{
public partial class SeperateWindow : Form
{
List<ItemModel> _modelList = new List<ItemModel>();
internal SeperateWindow(List<ItemModel> modelList)
{
_modelList = modelList;
InitializeComponent();
}
public void PopulateGrid()
{
dataGridView1.DataSource = _modelList;
}
}