我有很多与datagrid的数据源绑定有关的问题。我有一个DatagridView,我从列表中设置DataSource
List<Myclass> li = new List<MyClass>();
MyClass O = new MyClass();
O.Name = "Aden";
O.LastName = "B";
O.Id = 12;
li.Add(O);
O = new MyClass();
O.Name = "Li";
O.LastName = "S";
O.Id = 22;
li.Add(O);
Mydgv.DataSource = li;
MyClass的位置
public Class MyClass
{
public string Name {get; set;}
public string LastName {get; set;}
public decimal Id {get; set;}
}
现在想要向我的DataGridView添加新行
DataGridViewRow row = (DataGridViewRow)yourDataGridView.Rows[0].Clone();
row.Cells[0].Value = "XYZ";
row.Cells[1].Value = 50.2;
Mydgv.Rows.Add(row);
但由于Datagrid的数据源与List li 结合,因此无法引发错误。 所以我的第一个问题是我怎么能这样做?
我的第二个问题是, 为此,我提出了一个解决方案来改变我的List li并向其添加新行数据,然后将其设置为datagrid的数据源,但我认为它不是一个可行的解决方案是否有更好的解决方案?
甚至试图通过CurrencyManager
来做CurrencyManager currencyManager1 = (CurrencyManager)BindingContext[MyGrid.DataSource];
currencyManager1.SuspendBinding();
DataGridViewRow row = (DataGridViewRow)yourDataGridView.Rows[0].Clone();
row.Cells[0].Value = "XYZ";
row.Cells[1].Value = 50.2;
Mydgv.Rows.Add(row);
currencyManager1.ResumeBinding();
据我所知,我暂停了DataGrid的绑定,以便在我的帖子Make Row Visible false中执行时为Grid提供格式。 但是为什么在向datagrid添加行时它不起作用?
答案 0 :(得分:16)
尝试使用BindingList而不是List:
BindingList<MyClass> li = new BindingList<MyClass>();
然后您从列表中添加或删除记录:
li.Add(new MyClass() { Id = 15, LastName = "Z", Name = "Agent" });
并且网格将自动显示该新行。
要让各个属性更新自动出现在网格中,那么您的类需要实现INotifyPropertyChanged接口:
public class MyClass : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName) {
if (PropertyChanged != null) {
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
然后你的财产必须提出这个事件:
private string lastName = string.Empty;
public string LastName {
get { return lastName; }
set {
if (value != lastName) {
lastName = value;
OnPropertyChanged("LastName");
}
}
}
现在,如果您从代码更新一行,网格将显示更新:
li[1].LastName = "Q";
另见Implementing INotifyPropertyChanged - does a better way exist?
答案 1 :(得分:2)
以下是在将数据绑定到DataGridView之后向数据源添加行的解决方案。
请注意,我在表单中使用了空白DataGridView“Mydgv”和Button“button1”。
我也从你的问题中使用了相同的“MyClass”。
在表单中放入一个名为“button1”的按钮并编写此代码
private void button1_Click(object sender, EventArgs e)
{
List<MyClass> li = (List<MyClass>)Mydgv.DataSource;
MyClass O = new MyClass();
O.Name = "XYZ";
O.LastName = "G";
O.Id = new Random().Next(10, 100);
li.Add(O);
Mydgv.DataSource = li.ToList<MyClass>();
}
单击按钮,您可以看到DataGridView已使用新行更新。
不要像DataSource那样设置相同的List对象,而是尝试MyClass列表,如下所述。
Mydgv.DataSource = li.ToList&lt; MyClass&gt;();
为了便于理解,我将Id作为10到100之间的随机数。
希望您检查一下,如果代码有任何问题,请回复我。
答案 2 :(得分:0)
按照步骤......
创建MyClass的ObservableCollection属性。
private ObservableCollection<MyClass> _li;
public ObservableCollection<MyClass> Li
{
get;
set
{
_li = value;
NotifyPropertyChangedEvent("Li");
}
}
将DataGrid DataSource绑定到XAML文件中的“Li”属性。
现在每当更新集合(即添加或删除项目)时,DataSource都会自动更新。
答案 3 :(得分:0)
创建全局
List<Myclass> li = new List<MyClass>();
Page_load或任何功能
的外侧添加/删除任何函数中li的任何行,并在更改li
中的数据时调用以下行gridview.DataSource=li;
gridview.DataBind();
答案 4 :(得分:0)
@Co。亚丁
根据我所看到的,您在将列表绑定到网格的第一部分中所做的一切都是正确的。在提供数据源之后,您错过了调用数据绑定方法的执行。
调用DataBind方法后,详细信息应按照您的预期显示在网格上。
Mydgv.DataBind();
参考样本:
C#:
public partial class home : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
List<Student> students = new List<Student>();
for (int i = 0; i < 10; i++)
{
students.Add(new Student(){FirstName = "First Name - " +i.ToString(),LastName = "Last Name - "+i.ToString()});
}
students.Add(new Student() { FirstName = " ", LastName = " " });
UsingDataSourceAndDataBind(students);
}
private void UsingDataSourceAndDataBind(List<Student> students)
{
GridView1.DataSource = students;
GridView1.DataBind();
}
}
class Student
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
ASPX代码:
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
</div>
</form>