在wpf中动态地向DataGrid添加列
本文关键字:DataGrid 添加 wpf 动态 | 更新日期: 2023-09-27 18:05:59
我目前正在一个自定义画布上工作,我必须添加一个表,所以我认为dataGrid会很好。所以我想创建一个"表"从"Datagrid"由用户可以在运行时添加一个表到画布
到目前为止,我已经尝试用列表填充DataGrid并成功了。
如何在运行时向Datagrid添加列,以便在运行时使用文本框从用户处获取列数和标题值,并根据文本框的值,Datagrid应添加列和标题值
实际上我想开发一个表,其中用户传递的列和列头的no和表应该生成。
或
"你能建议我用一种方式,我应该看看,以便使用DrawingVisual类"绘制"一个表"
它是GraphicsTable类的一部分
//Custom Classes "DrawingCanvas & GraphicsTable"
public void CreateDataGrid(GraphicsTable graphicsTable, DrawingCanvas drawingCanvas)
{
dt = new DataGrid();
dt.Name = "Data";
dt.ItemsSource = person();
dt.AllowDrop = true;
dt.AutoGenerateColumns = true;
dt.Height = graphicsTable.Rectangle.Height;
dt.Width = graphicsTable.Rectangle.Width;
drawingCanvas.Children.Add(dt);
Canvas.SetTop(dt, graphicsTable.Rectangle.Top);
Canvas.SetLeft(dt, graphicsTable.Rectangle.Left);
dt.Width = dt.Width;
dt.Height = dt.Height;
dt.Focus();
}
//I have just tried to add dome dummy data to the datagrid.
public List<Person> person()
{
List<Person> peep = new List<Person>();
peep.Add(new Person() {});
return peep;
}
public class Person
{
private string name;
private double salary;
public string Names
{
get { return name; }
set { name = value; }
}
public double Salary
{
get { return salary; }
set { salary = value; }
}
}
您可以动态地构建DataGrid的列,如下所示。
public void buildTable(string[] headers)
{
myGrid.Columns.Clear();
foreach (string header in headers)
{
DataGridTextColumn c = new DataGridTextColumn();
c.Header = header;
myGrid.Columns.Add(c);
}
}
如果您正在设置ItemsSource,但是,行和列的数量将自动调整以匹配ItemsSource的值。例如,下面的代码生成一个3行3列的DataGrid。
dt = new DataTable();
for (int i = 0; i < 3; i++)
dt.Columns.Add("col" + i.ToString());
for (int i = 0; i < 3; i++)
{
DataRow r = items.NewRow();
r[0] = "a" + i.ToString();
r[1] = "b" + i.ToString();
r[2] = "c" + i.ToString();
dt.Rows.Add(r);
}
myGrid.ItemsSource = dt;
<>之前+------+------+------+| col0 | col1 | col2+------+------+------+| a0 | b0 | c0 |+------+------+------+| a1 | b1 | c1 |+------+------+------+| a2 | b2 | c2 |+------+------+------+之前在不知道你的确切要求的情况下,我不会费心在代码中手动绘制表格,除非你有一些特殊需要自定义图形,即使在这种情况下,我也会考虑使用XAML重新设计DataGrid或它的元素,然后再尝试自己渲染它。不过这只是我的观点。祝你好运!
编辑:如果希望根据用户输入生成表列,则只需要将列生成代码放在事件处理程序中。在您的示例中,您可以为Textbox TextChanged事件添加事件处理程序,如下所示。此事件处理程序将在每次文本框中的文本更改时运行。您可能需要添加验证以防止用户键入大量数字。
private void numColsTextbox_TextChanged(object sender, TextChangedEventArgs e)
{
int numCols;
if (Int32.TryParse(tb.Text, out numCols))
{
myGrid.Columns.Clear();
for (int i = 1; i <= numCols; i++)
{
DataGridTextColumn c = new DataGridTextColumn();
c.Header = "Column " + i.ToString();
myGrid.Columns.Add(c);
}
}
}