首页 > 解决方案 > DataGrid 中的动态行和列以及从 WPF 控件写入的每个单元格

问题描述

我是 WPF 新手,我正在尝试创建一个 DataGrid,其中定义了 4 列“票务信息”、“名称”、“电子邮件”和“邮政编码”。我要做的是:

System.Data.DataTable table = new System.Data.DataTable();

    table.Columns.Add("Info Tickets");
    table.Columns.Add("Name");
    table.Columns.Add("Email");
    table.Columns.Add("ZipCode");

后来我打算根据用户给出的数字自动生成行,我将这个数量保存在一个变量中并在一个循环中使用它来以这种方式生成行:

int quantity = (int)Application.Current.Resources["NumPeopleQuantity"];
    for (int i = 0; i < quantity; i++)
    {
        // Create row
        System.Data.DataRow row = table.NewRow();

        row["Info Tickets"] = i + 1;
        row["Name"] = "";
        row["Email"] = "";
        row["ZipCode"] = "";

        // Insert the row
        table.Rows.Add(row);
    }

最后,我将表与我创建的数据网格相关联,如下所示:

Grid1.ItemsSource = ((System.ComponentModel.IListSource)table).GetList();

这可以正常工作,并将所需的列和行添加到 DataGrid。到目前为止一切都很完美,我可以从我的电脑键盘上为每一行写一个姓名、电子邮件和邮政编码,当信息被正确填写后,我有一个按钮可以检索 dataGrid 的所有内容并将其分配给模型操作它在代码中,我这样做如下:

 System.Data.DataView data = (System.Data.DataView)Grid1.ItemsSource;


    var f = (PaymentViewModel)DataContext;

    string expresion;
    expresion = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";

    for (int i = 0; i < data.Count; i++)
    {
        obj = new DataContactTicket
        {
            CustomerName = data.Table.Rows[i]["Name"].ToString(),
            CustomerEmail = data.Table.Rows[i]["Email"].ToString(),
            CustomerZip = data.Table.Rows[i]["ZipCode"].ToString()

        };
        if (obj.CustomerName == "" || obj.CustomerEmail == "" || obj.CustomerZip == "")
        {
            f.Mensaje = "Ticket information fields cannot be empty";
            return;
        }
        else
        {

            if (Regex.IsMatch(obj.CustomerEmail, expresion))
            {
                if (Regex.Replace(obj.CustomerEmail, expresion, String.Empty).Length == 0)
                {
                    names.Add(obj);
                }
                else
                {
                    return;
                }
            }
            else
            {
                f.Mensaje = "Please validate the email format";
                return;
            }
        }
    }



    f.Grid1 = names;

我进行了相应的验证并将它们分配给我的 ViewModel 中的一个列表,一切都是正确的,我遇到的问题是我需要用户从 onScreenKeyboard 而不是从计算机的键盘输入这些信息来输入文本框很容易,参考如下所示:

<TextBox x:Name="TxtMail" Height="auto"  Width="500"  FontSize="24" FontWeight="Bold" TextChanged="TxtMail_TextChanged"
                    Text="{Binding Text, ElementName=onScreenKeyboard}"/>

 <Grid HorizontalAlignment="Stretch" Margin="114,-208,-114,208">
                <StackPanel HorizontalAlignment="Left" Margin="-132,240,0,-240">
                    <TermControls:OnScreenKeyboard x:Name="onScreenKeyboard" HorizontalContentAlignment="Stretch"  VerticalAlignment="Bottom" VerticalContentAlignment="Bottom" Grid.ColumnSpan="3"  Grid.Row="1" Grid.RowSpan="4" />
                </StackPanel>

这个想法是,对于用户选择的dataGrid的每个单元格,他也可以通过其中的控件进行写入,我还没有找到这样做的方法。我希望你能帮助我,非常感谢。

标签: c#wpfdatagridcell

解决方案


推荐阅读