首页 > 解决方案 > 根据行 ID 值选择 DataGrid 索引?

问题描述

这是我的第一个项目,所以要温柔

我知道如何使用以下代码获取当前行索引值及其 [ID] 值:

public void Sql_Address_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    DataGrid gd = (DataGrid)sender;
    if (gd.SelectedItem is DataRowView row_selected)
    {
        Public_Strings.selectedID = Int32.Parse(row_selected["ID"].ToString());
        Public_Strings.currentIndex = Int32.Parse(sql_address.SelectedIndex.ToString());
    }
}

我在两个不同的地方显示同步的 SQL 表值——TabItem 1 中的 DataGrid 和 TabItem 2 中的几个可编辑文本框。TabItem 2 中还有 Next/Previous 按钮可以上下移动 DataGrid Index 也刷新内容的文本框。一切正常,但是当我在 SQL 表中添加或修改条目时,索引会发生变化,因为分组和下一个/上一个按钮重置为默认索引 0。

我知道在使用此方法删除条目时如何绕过它:

public void Delete(object sender, RoutedEventArgs e)
{
    MessageBoxResult messageBoxResault = System.Windows.MessageBox.Show("Ali se prepričani?", "Potrditev izbrisa", System.Windows.MessageBoxButton.YesNo);
    if (messageBoxResault == MessageBoxResult.Yes)
    {
        Public_Strings.currentIndex= sql_address.SelectedIndex-1;
        SqlCommand cmd = new SqlCommand
            {
                CommandText = "DELETE FROM cbu_naslovi WHERE [ID]='" + Public_Strings.selectedID + "'",
                Connection = con
            };
        cmd.ExecuteNonQuery();
        Datagrid();
        sql_address.SelectedIndex = Public_Strings.currentIndex;
    }
}

我的添加方法:

public void Add(object sender, RoutedEventArgs e)
{
    MessageBoxResult messageBoxResault = System.Windows.MessageBox.Show("Ali se prepričani?", "Potrditev vnosa", System.Windows.MessageBoxButton.YesNo);
    if (messageBoxResault == MessageBoxResult.Yes)
    {
        SqlCommand cmd = new SqlCommand
            {
                CommandText = "INSERT INTO cbu_naslovi VALUES ('" + ulica.Text + "','" + hisna_st.Text + "','" + id_hise.Text + "','" + postna_st.Text + "','" + obmocje.Text + "','" + katastrska_obcina.Text + "','" + st_objekta.Text + "','" + st_delov.Text + "','" + st_parcele_1.Text + "','" + st_parcele_2.Text + "','" + st_parcele_3.Text + "','" + st_parcele_4.Text + "','" + st_parcele_5.Text + "','" + st_parcele_6.Text + "','" + st_parcele_7.Text + "')",
                Connection = con
            };
        cmd.ExecuteNonQuery();
        Datagrid();
        address.Content = ulica.Text.ToString() + " " + hisna_st.Text.ToString() + id_hise.Text.ToString();
    }
}

我需要一个允许我根据行的 ID 值选择索引的解决方案,以便当我在 SQL 表中添加或修改和条目时,Next/Previous 按钮从新添加/修改的索引继续。基本上是这样的:

sql_address.SelectedIndex = "sql_address.SelectedIndex where sql_address[ID] = Public_Strings.currentIndex" - Paraphrasing 

视觉参考:

https://image.ibb.co/k2XDAz/1.png

https://image.ibb.co/gJ00qz/2.png

标签: c#wpf

解决方案


我使用以下代码组合解决了这个问题:

public void Add(object sender, RoutedEventArgs e)
{
    MessageBoxResult messageBoxResault = System.Windows.MessageBox.Show("Ali se prepričani?", "Potrditev vnosa", System.Windows.MessageBoxButton.YesNo);
    if (messageBoxResault == MessageBoxResult.Yes)
    {
        SqlCommand cmd = new SqlCommand
            {
                CommandText = "INSERT INTO cbu_naslovi VALUES ('" + ulica.Text + "','" + hisna_st.Text + "','" + id_hise.Text + "','" + postna_st.Text + "','" + obmocje.Text + "','" + katastrska_obcina.Text + "','" + st_objekta.Text + "','" + st_delov.Text + "','" + st_parcele_1.Text + "','" + st_parcele_2.Text + "','" + st_parcele_3.Text + "','" + st_parcele_4.Text + "','" + st_parcele_5.Text + "','" + st_parcele_6.Text + "','" + st_parcele_7.Text + "')",
                Connection = con
            };
        cmd.ExecuteNonQuery();
        SaveID();
        sql_address.SelectedIndex = 0;
        SearchIndex();
        address.Content = ulica.Text.ToString() + " " + hisna_st.Text.ToString() + id_hise.Text.ToString();
        search.Text = string.Empty;
    }
}

public void SaveID()
{
    DatagridIndex();
    sql_address.SelectedIndex = sql_address.Items.Count - 1;
    Public_Strings.saveID3 = Public_Strings.saveID1;
    Datagrid();
}

public void SearchIndex()
{
    if (Public_Strings.saveID3 == Public_Strings.saveID1) { }
    else
    {
        sql_address.SelectedIndex++;
        SearchIndex();
    }
}

public void DatagridIndex()
{
    SqlCommand cmd = new SqlCommand
        {
            CommandText = "SELECT * FROM [cbu_naslovi] ORDER BY [ID] ASC",
            Connection = con
        };
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    dataGrid1 = new DataTable("cbu_naslovi");
    da.Fill(dataGrid1);
    sql_address.ItemsSource = dataGrid1.DefaultView;
}

public void Datagrid()
{
    SqlCommand cmd = new SqlCommand
        {
            CommandText = "SELECT * FROM [cbu_naslovi] ORDER BY [ULICA] ASC, LEN ([HS]) ASC, [HS] ASC, [HID] ASC",
            Connection = con
        };
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    dataGrid1 = new DataTable("cbu_naslovi");
    da.Fill(dataGrid1);
    sql_address.ItemsSource = dataGrid1.DefaultView;
}

TLDR 版本,添加一个条目并创建一个按 ID ASC 排序的“新”数据网格,只要您使用自动增量,列表中的最后一个 ID 始终是新创建的。将该 ID 保存在一个新的字符串中。现在调用“正确的”Datagrid,按照您想要的方式对其进行排序,并将从索引 0 开始的 ID 与保存的 ID 进行比较,直到找到正确的 ID,然后停止代码。您的添加按钮现在应该将您重定向到正确的索引,并且您的下一个/上一个按钮应该可以正常工作。

Edit_v1:可能有一个更简单的解决方案,但我太笨了,找不到它(理论上可以通过每次按下“添加”按钮时向计数器添加 +1 的方法来解决它,但请注意从正确的开始导入 CVS 文件时的 ID 数)。

Edit_v2:或者只是 SQL 来查找最后一个 ID: 从表中获取最后一个记录 ID 的最安全方法 然后使用以下方法将其转换为字符串: 如何将 SQL 结果转换为 STRING 变量?

Edit_v3:另一种方法:

    public void Add(object sender, RoutedEventArgs e)
    {
        if (ulica.Text != "" && hisna_st.Text != "" && postna_st.Text != "" && obmocje.Text != "")
        {
            MessageBoxResult messageBoxResault = MessageBoxEx.Show(this, "Ali se prepričani?", "Potrditev vnosa", MessageBoxButton.YesNo);
            if (messageBoxResault == MessageBoxResult.Yes)
            {
                SqlCommand cmd = new SqlCommand
                {
                    CommandText = "INSERT INTO cbu_naslovi VALUES ('" + ulica.Text + " " + hisna_st.Text + id_hise.Text + "','" + ulica.Text + "','" + hisna_st.Text + "','" + id_hise.Text + "','" + postna_st.Text + "','" + obmocje.Text + "','" + katastrska_obcina.Text + "','" + st_objekta.Text + "','" + st_delov.Text + "','" + st_parcele_1.Text + "','" + st_parcele_2.Text + "','" + st_parcele_3.Text + "','" + st_parcele_4.Text + "','" + st_parcele_5.Text + "','" + st_parcele_6.Text + "','" + st_parcele_7.Text + "','" + st_parcele_8.Text + "','" + st_parcele_9.Text + "','" + st_parcele_10.Text + "','" + st_parcele_11.Text + "','" + st_parcele_12.Text + "','" + st_parcele_13.Text + "','" + st_parcele_14.Text + "','" + st_parcele_15.Text + "','" + st_parcele_16.Text + "','" + st_parcele_17.Text + "'); SELECT SCOPE_IDENTITY();",
                    Connection = con
                };
                int lastId = Convert.ToInt32(cmd.ExecuteScalar());
                InvokeDataGridAddress();
                SetToRow(lastId);
                address.Content = ulica.Text.ToString() + " " + hisna_st.Text.ToString() + id_hise.Text.ToString();
            }
        }
        else
        {
            MessageBoxEx.Show(this, "Vpisati je potrebno podatke!");
        }
    }

    public int CurrentID
    {
        get
        {
            int tmp = 0;
            if (dg_address.SelectedIndex >= 0)
            {
                int.TryParse(dtAddress.Rows[dg_address.SelectedIndex].ItemArray[0].ToString(), out tmp);
            }
            return tmp;
        }
    }

    public void SetToRow(int Id)
    {
        Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait;
        dg_address.SelectionChanged -= DG_Address_SelectionChanged;
        while (CurrentID != Id && dg_address.SelectedIndex < dtAddress.Rows.Count - 1)
        {
            dg_address.SelectedIndex++;
        }
        dg_address.SelectionChanged += DG_Address_SelectionChanged;
        Mouse.OverrideCursor = System.Windows.Input.Cursors.Arrow;
    }

推荐阅读