【问题标题】:DataGrid can't type in comma or dots as value?DataGrid 不能输入逗号或点作为值?
【发布时间】:2017-08-14 17:23:04
【问题描述】:

我得到了以下代码。如果我现在尝试在我的“EK-Preis”列中输入一个逗号或一个点,这是一个双精度,它不起作用。我只会写数字或字母。如果我输入一个字母,单元格会得到一个红色轮廓,这是完美的。有什么想法吗?

这是我的代码:

        private void dgFolien_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
    {
        DataRowView drv = e.Row.DataContext as DataRowView;
        try
        {
            if (drv != null)
            {
                using (OleDbConnection conn = new OleDbConnection(connection.ConnectionString))
                {
                    conn.Open();
                    OleDbCommand cmd = conn.CreateCommand();
                    cmd.Parameters.Add(new OleDbParameter("@var1", drv["Hersteller"].ToString()));
                    cmd.Parameters.Add(new OleDbParameter("@var2", drv["Serie"].ToString()));
                    cmd.Parameters.Add(new OleDbParameter("@var3", drv["Farbe"].ToString()));
                    cmd.Parameters.Add(new OleDbParameter("@var4", drv["EK-Preis"].ToString()));
                    cmd.Parameters.Add(new OleDbParameter("@var5", drv["FolienID"].ToString()));


                    cmd.CommandText = "UPDATE Folien SET Hersteller=@var1, Serie=@var2, Farbe=@var3, [EK-Preis] = @var4 WHERE FolienID=@var5";
                    cmd.ExecuteNonQuery();
                }
            }
        }
        catch (Exception ex)
        {
            System.Windows.Forms.MessageBox.Show("Error " + ex);
        }
    }

这里是我的 XAML:

       <DataGrid x:Name="dgFolien" AutoGenerateColumns="False" CanUserAddRows="False" HorizontalAlignment="Left" 
              Height="268" Margin="10,138,0,0" VerticalAlignment="Top" Width="489" ColumnWidth="*" RowEditEnding="dgFolien_RowEditEnding">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Hersteller" Binding="{Binding Hersteller, UpdateSourceTrigger=PropertyChanged}" />
            <DataGridTextColumn Header="Serie" Binding="{Binding Serie, UpdateSourceTrigger=PropertyChanged}" />
            <DataGridTextColumn Header="Farbe" Binding="{Binding Farbe, UpdateSourceTrigger=PropertyChanged}" />
            <DataGridTextColumn Header="EK-Preis" Binding="{Binding EK-Preis, UpdateSourceTrigger=PropertyChanged}" />
        </DataGrid.Columns>
    </DataGrid>

谢谢!

【问题讨论】:

  • 不确定实际问题,但在drv["Hersteller"].ToString() 这些行中,您将获取您的drv 的属性并全部执行.ToString()。以这种方式创建的数据库命令通常从给定对象中推断出它们的类型;我相当确定这些字段都不能被视为数字。它们都以字符串形式给出。
  • 我用 cmd.Parameters.Add(new OleDbParameter("@var4", Convert.ToDouble(drv["EK-Preis"])));不工作。我的应用程序不允许我在单元格中输入逗号或点。
  • 当然,我不知道数据库是什么样的。可能所有这些东西都是你数据库中的字符串。但如果不是,那么,从我所见,您将它们全部作为字符串传递。我不太熟悉 wpf 做这些事情的方式,但是如果其中一些是双精度的,我认为您需要以某种方式定义所有列的类型。

标签: c# wpf datagrid converter


【解决方案1】:

UpdateSourceTrigger=PropertyChanged 强制在每次击键时处理文本。 将其更改为 UpdateSourceTriggerLostFocus 。例如,如果您的值为 12.45,则在检测到 '.' 的那一刻,它预计 45 是绑定到 12 的属性。

【讨论】:

  • "例如,如果您的值为 12.45。时刻 '.'检测到它期望 45 是绑定到 12" 的属性。我不认为它是这样工作的,datagrid 不会在这里创建绑定。更有可能“在 12 个数据网格之后键入点的时刻仍将其解释为值 12 并显示没有点的格式化值”
  • 作为更改 UpdateSourceTrigger set Delay Binding (.net 4.5) {Binding Farbe, Delay=400, UpdateSourceTrigger=PropertyChanged } 属性的替代解决方案。输入12 稍等(0.5 秒),输入.,再次等待 - 点消失!
  • 请在这里参考这个问题:stackoverflow.com/questions/24273543/…这确实是发生了什么。
猜你喜欢
  • 2022-01-18
  • 2017-06-09
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
相关资源
最近更新 更多