【问题标题】:Changing a DataGrid's column width更改 DataGrid 的列宽
【发布时间】:2012-07-14 13:06:56
【问题描述】:

我想更改 DataGrid 的列宽,但一直收到错误消息。

这就是我填写 DataGrid 的方式:

tabel.ItemsSource = Item.getItemByCategory(category).DefaultView;

getItemByCategoryItem 类的静态方法,它返回DataTable

这是我尝试调整列大小的方式:

tabel.Columns[1].Width = 100;

这是我收到的错误:

索引超出范围。必须是非负数且小于集合的大小。 参数名称:索引

出于某种原因,tabel.Columns.Count == 0。虽然在显示后立即显示了 4 列。

我可以在调整列大小方面获得一些帮助吗?

【问题讨论】:

  • Windows Forms是什么WPF?
  • WPF。很抱歉忘记提及
  • 您如何以及在何处设置列?您是否尝试在列初始化之前设置宽度?
  • 我在创建 DataTable 时添加了列。这是代码:pastebin.com/p9ygHwx6
  • 是的,我没有点击外部链接。如果您需要帮助,您应该将代码粘贴到您的问题中(但仅限相关代码)。

标签: c# wpf datagrid datatable


【解决方案1】:

试试这样的:

XAML 文件:

<Window x:Class="DataGridView.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid Name="table" Loaded="table_Loaded" />
    </Grid>
</Window>

代码隐藏文件:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data;

namespace DataGridView
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();


            table.ItemsSource = getItemByCategory().DefaultView;
        }

        public static DataTable getItemByCategory(int category = 0)
        {
            //ServiceReference.ServiceSoapClient instance = Database.getClient();
            DataTable tabel = new DataTable();
            DataRow linie;
            tabel.Columns.Add(new DataColumn("id", typeof(int)));
            tabel.Columns.Add(new DataColumn("name", typeof(string)));

            //tabel.Columns.Add(new DataColumn("price", typeof(int)));
            //tabel.Columns.Add(new DataColumn("inCart", typeof(bool)));
            //ServiceReference.ArrayOfString[] values = instance.getItemsByCategory(category);

            List<Foo> values = new List<Foo>();
            for (int i = 0; i < 10; i++)
            {
                values.Add(new Foo { ID = i, Name = "name " + i });
            }

            foreach (var v in values)
            {
                linie = tabel.NewRow();
                linie["id"] = v.ID;
                linie["name"] = v.Name;
                //linie["price"] = Convert.ToInt32(v[3]);
                //linie["inCart"] = false;
                tabel.Rows.Add(linie);
            }
            return tabel;
        }

        private void table_Loaded(object sender, RoutedEventArgs e)
        {
            table.Columns[0].Width = 100;
            table.Columns[1].Width = 200;
        }
    }

    public class Foo
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }


}

【讨论】:

  • 你不必解释所有这些。只需告诉在 Datagrid.Loaded 事件处理程序中调整列的大小。无论如何,它有帮助。所以+1
【解决方案2】:

如果列是自动生成的,您应该推迟访问直到AutoGeneratedColumns 触发。

【讨论】:

  • 列是自动生成的。如果我关闭 autoGenerateColumns,那么我看不到我之前插入的数据。
猜你喜欢
  • 2011-04-11
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 2011-08-22
  • 2010-11-20
  • 2011-07-29
相关资源
最近更新 更多