C# 根据行ID值选择DataGrid索引?

C# 根据行ID值选择DataGrid索引?,c#,wpf,C#,Wpf,这是我的第一个项目,所以要温柔 我知道如何使用以下代码获取当前行索引值及其[ID]值: public void Sql_Address_SelectionChanged(object sender, SelectionChangedEventArgs e) { DataGrid gd = (DataGrid)sender; if (gd.SelectedItem is DataRowView row_selected) { Public_Strings.s

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

我知道如何使用以下代码获取当前行索引值及其[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中还有下一个/上一个按钮,用于上下移动DataGrid索引,这也会刷新文本框的内容。一切正常,但当我在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表中添加或修改和输入时,下一个/上一个按钮从新添加/修改的索引继续。基本上是这样的:

sql_address.SelectedIndex = "sql_address.SelectedIndex where sql_address[ID] = Public_Strings.currentIndex" - Paraphrasing 
视觉参照:


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

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,只要您使用自动增量。将该ID保存在新字符串中。现在调用“正确的”数据网格,按您想要的方式排序,并将从索引0开始的ID与保存的ID进行比较,直到找到正确的ID,然后停止代码。“添加”按钮现在应该将您重定向到正确的索引,并且“下一个/上一个”按钮应该可以正常工作

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

编辑_v2:或仅通过SQL查找最后一个ID: 然后使用以下方法将其转换为字符串:

编辑_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;
    }
public void Add(对象发送方、路由目标方)
{
如果(ulica.Text!=“”&&hisna\u st.Text!=“”&&postna\u st.Text!=“”&&obmocje.Text!=“”)
{
MessageBoxResult MessageBoxResult=MessageBoxEx.Show(这是“Ali se prepičani?”,“Potrditev vnosa”,MessageBoxButton.YesNo);
如果(MessageBoxResult==MessageBoxResult.Yes)
{
SqlCommand cmd=新的SqlCommand
{
CommandText=“插入cbu_naslovi值(“+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"st"objekta.Text+”、“+delu.Text+”、“+1.Text+”“,““,““+st-st-st-U-Parcel-Parcel-U 4.文本+”,““,”,““+st-st-st-U-parcele-U 4.文本+”,“+st-st-U-parcele-U-parcele-U-U-U-U-U-2.文本+2.文本+2.文本+”,““,“,“,“,“,,“,“,,“,,“,“,“,“,“““+st-st-st-st-st-U-U-8.8.8.8.文本+8.文本+8.文本+8.文本+文本+文本+文本+”””,“,“,“,“,“,“,“,“,“,“,“,“,“,“,“,“,“,“,”””””””,”,”,”,”8.8.Text+“,”+st_parcele_13.Text+“,”+st_parcele_14.Text+”、“+st_parcele_15.Text+”、“+st_parcele_16.Text+”、“+st_parcele_17.Text+”);选择范围标识(),
连接=con
};
int lastId=Convert.ToInt32(cmd.ExecuteScalar());
InvokeDataGridAddress();
SetToRow(lastId);
address.Content=ulica.Text.ToString()+“”+hisna_st.Text.ToString()+id_hise.Text.ToString();
}
}
其他的
{
MessageBoxEx.Show(这是“vpisatijepotrebnopodatke!”);
}
}
公共int CurrentID
{
得到
{
int-tmp=0;
如果(dg_address.SelectedIndex>=0)
{
int.TryParse(dtAddress.Rows[dg_address.SelectedIndex].ItemArray[0].ToString(),out tmp);
}
返回tmp;
}
}
公共无效设置箭头(int Id)
{
Mouse.OverrideCursor=System.Windows.Input.Cursors.Wait;
dg_address.SelectionChanged-=dg_address_SelectionChanged;
while(CurrentID!=Id&&dg_address.SelectedIndex