【问题标题】:Refreshing Datagrid in WPF c#在 WPF c# 中刷新 Datagrid
【发布时间】:2014-07-27 05:05:34
【问题描述】:

我有这个项目,我必须将文件添加到我的数据网格,然后当我单击它时,我可以编辑或删除我添加的文件。这是我的表单的示例屏幕截图

当我单击添加时,文本框中的文件将被添加到数据网格中。它确实有效。

然后,当我单击数据网格中的数据时,文件名将插入到我的文本框中,以便我对其进行编辑。然后,当我单击编辑时,网格必须刷新显示已编辑的文件。与删除相同。

问题是当我尝试编辑或删除我的文件并刷新我的网格时,出现错误。

我确定文件已被编辑/删除,但我没有刷新我的网格,而是它给了我错误。

这是我刷新网格的代码。每当我单击添加/编辑/删除按钮时,我都会调用此方法

 public void DisplaySourceFile()
    {

        try
        {
            if (CONN.State != ConnectionState.Open)
            {
                CONN.Open();
            }


            CMD = new SqlCommand("Select sf_id as [ID], sf_name as [FILES] from [Source_File] where s_id = @s_id", CONN);
            CMD.Parameters.AddWithValue("@s_id", SourceId);
            DA = new SqlDataAdapter(CMD);
            DT = new DataTable("Role");
            DA.Fill(DT);
            dataGridFile.ItemsSource = DT.DefaultView;

        }
        catch
        {
            throw;
        }
        finally
        {
            if (CONN.ToString() != String.Empty && CONN.State != ConnectionState.Closed)
                CONN.Close();
        }

    }

在我的数据网格中选择项目时,这里是我的代码:

 private void dataGridFile_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        bo_source = new BO.BO_Source();
        dal_source = new DAL.DAL_Source();
        //Check if there is selected item

            dal_source.selectedSourceFile = Convert.ToInt32((DT.Rows[dataGridFile.SelectedIndex])[0].ToString());

        selectedSource = dal_source.selectedSourceFile;
        btnEdit.IsEnabled = true;
        btnDelete.IsEnabled = true;
        btnAdd.IsEnabled = false;

        if (dal_source.GetSourceFileInfo(bo_source) == true)
        {
            txtFileName.Text = bo_source.sf_name;
        }
    }

谁能帮帮我。

【问题讨论】:

  • 我建议您不要采用当前的方法,而是采用更 WPF 方式的 MVVM 方法,所以在我回答您的问题之前,请告诉我您是否愿意采用 MVVM,或者您会坚持你所拥有的。
  • 我正在使用分层,知道吗。
  • 分层代码很不错,但我可以从您分享的代码中看到层之间的紧密耦合。所以想知道您是否打算修改它或保持原样。
  • 我很想保持原样。

标签: c# wpf datagrid


【解决方案1】:

从您分享的内容中我可以看到,错误地指的是索引 -1 处的行。

由于任何索引都是从 0 开始的,所以 -1 是不可能编辑或删除的。

所以这个场景的解决方案是管理索引

  • 删除第一行或最后一行时,它不应低于 0
  • 删除最后一行时,它也不应该超过 max rows-1

如果它跨越任何边界,你需要相应地处理。

问题似乎在这里

//Check if there is selected item
dal_source.selectedSourceFile = Convert.ToInt32((DT.Rows[dataGridFile.SelectedIndex])[0].ToString());

所以也许改变它来验证

//Check if there is selected item
int selectedIndex = dataGridFile.SelectedIndex;
if(selectedIndex > -1 && selectedIndex < DT.Rows.Count)
{
    dal_source.selectedSourceFile = Convert.ToInt32((DT.Rows[selectedIndex])[0].ToString());

    selectedSource = dal_source.selectedSourceFile;
    btnEdit.IsEnabled = true;
    btnDelete.IsEnabled = true;
    btnAdd.IsEnabled = false;

    if (dal_source.GetSourceFileInfo(bo_source) == true)
    {
        txtFileName.Text = bo_source.sf_name;
    }
}

这应该可以解决您当前的问题。

MVVM方式

在这种方法中,将您的模型与数据网格绑定为 ObservableCollection,然后操作集合而不是处理 UI 元素,因此 WPF 强大的绑定框架将处理删除、添加或刷新

【讨论】:

  • 我什至不知道为什么它一直告诉我我在索引 -1 有一行,即使我没有。
  • 这可能是由于您在未选择任何行时尝试使用 SelectedIndex 的原因。您能否在 pastebin.com 上分享完整代码,以便我们查看
  • 更新了DT.Rows[dataGridFile.SelectedIndex]中的错误答案
  • 我找到了解决这个问题的方法。 tnx
猜你喜欢
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
  • 2011-03-26
  • 2012-12-09
  • 2013-11-06
  • 2010-12-19
  • 2010-10-30
  • 1970-01-01
相关资源
最近更新 更多