1

私は WPF に非常に慣れていないため、非常に単純なデータベース アプリケーションを作成しました。最終的に、(データバインディングを使用せずに) winform でナビゲーション ボタンを使用することができました。私は非常に単純なものであることを願っている問題に到達しましたが、それでもわかりませんか?

問題

ナビゲーションボタンを使用すると、コンボックスにデータが表示されませんが、テキストボックスには問題がないようで、基本的に空で表示されます。私はリストビューを持っているので、CUD操作のときにレコード全体が表示されます。私は何かを逃したことがありますか?

作成した部分クラスと showdata メソッド

 public partial class MainWindow : Window
 {
     SqlConnection mconn;
     int MaxRows = 0;
     int rno;
     DataSet ds;

     private void MaxRow()
     {
         MaxRows = ds.Tables[0].Rows.Count;
     }
}

public void ShowData()
    {
        try
        {
            //pardon me this looks rather tacty

            SqlCommand comm = new SqlCommand("Select * from tblTableB", mconn);
            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter(comm);
            da.Fill(dt);
            listView1.DataContext = dt.DefaultView;

            da = new SqlDataAdapter("select * from tblTableB", mconn);
            ds = new DataSet();
            da.Fill(ds, "TestDatabaseB");
            da.Update(ds, "TestDatabaseB");
            this.MaxRow();

            txtID.Text = ds.Tables[0].Rows[rno][0].ToString();
            txtName.Text = ds.Tables[0].Rows[rno][1].ToString();
            cBHealthDetails.Text = ds.Tables[0].Rows[rno][2].ToString(); //data not showing 
            when  navigation buttons are used. CB is showning empty

        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex.Message);
        }
    }

ナビゲーション方法の例

private void PreRec_Click(object sender, RoutedEventArgs e)
    {
        if (ds.Tables[0].Rows.Count > 0)
        {
            if (rno > 0)
            {
                rno--;
                ShowData();
            }
        }
    }

    private void NxtRec_Click(object sender, RoutedEventArgs e)
    {
        if (ds.Tables[0].Rows.Count > 0)
        {
            if (rno < ds.Tables[0].Rows.Count - 1)
            {
                rno++;
                ShowData();
            }
        }
    }

XAML コード

<Window x:Class="WpfApplication4.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="381" Width="406" Loaded="Window_Loaded">
<Grid>
    <Grid Height="342" HorizontalAlignment="Left"  Name="grid1" VerticalAlignment="Top" Width="384">
        <ListView Height="134" HorizontalAlignment="Left" Name="listView1"  ItemsSource="{Binding}" VerticalAlignment="Top" Width="384">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="ID" DisplayMemberBinding="{Binding Path=ID}"></GridViewColumn>
                    <GridViewColumn Header="Name"  DisplayMemberBinding="{Binding Path=Name}"></GridViewColumn>
                    <GridViewColumn Header="Health Details" DisplayMemberBinding="{Binding Path=HealthDetails}"></GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
        <Label Content="Name" Height="28" HorizontalAlignment="Left" Margin="7,181,0,0" Name="label1" VerticalAlignment="Top" />
        <Label Content="Health Details" Height="28" HorizontalAlignment="Left" Margin="7,215,0,0" Name="label2" VerticalAlignment="Top" />

        <TextBox Height="23" HorizontalAlignment="Left" Margin="102,152,0,0" Name="txtID" VerticalAlignment="Top" Width="120" DataContext="{Binding ElementName=listView1,Path=SelectedItem}" Text="{Binding Path=ID}" IsReadOnly="True" Background="#26000000"></TextBox>
        <TextBox Height="23" HorizontalAlignment="Left" Margin="102,186,0,0" Name="txtName" VerticalAlignment="Top" Width="243" DataContext="{Binding ElementName=listView1,Path=SelectedItem}" Text="{Binding Path=Name}" />
        <ComboBox Height="23" HorizontalAlignment="Left" Margin="102,220,0,0" Name="cBHealthDetails" VerticalAlignment="Top" Width="120" DataContext="{Binding ElementName=listView1,Path=SelectedItem}" Text="{Binding Path=HealthDetails}">
            <ComboBoxItem Content="Yes" />
            <ComboBoxItem Content="No" />
        </ComboBox>
        <Button Content="New" Height="23" HorizontalAlignment="Left" Margin="25,262,0,0" Name="btnNew" VerticalAlignment="Top" Width="75" Click="btnNew_Click" />
        <Button Content="Insert" Height="23" HorizontalAlignment="Left" Margin="111,262,0,0" Name="btnInsert" VerticalAlignment="Top" Width="75" Click="btnInsert_Click"></Button>
        <Button Content="Update" Height="23" HorizontalAlignment="Left" Margin="197,262,0,0" Name="btnUpdate" VerticalAlignment="Top" Width="75" />
        <Button Content="Delete" Height="23" HorizontalAlignment="Left" Margin="280,262,0,0" Name="btnDelete" VerticalAlignment="Top" Width="75" />
        <Button Content="&lt;&lt;" Height="23" HorizontalAlignment="Left" Margin="25,301,0,0" Name="FirstRec" VerticalAlignment="Top" Width="75" Click="FirstRec_Click" />
        <Button Content="&lt;" Height="23" HorizontalAlignment="Left" Margin="111,301,0,0" Name="PreRec" VerticalAlignment="Top" Width="75" Click="PreRec_Click" />
        <Button Content="&gt;" Height="23" HorizontalAlignment="Right" Margin="0,301,112,0" Name="NxtRec" VerticalAlignment="Top" Width="75" Click="NxtRec_Click" />
        <Button Content="&gt;&gt;" Height="23" HorizontalAlignment="Left" Margin="280,301,0,0" Name="LastRec" VerticalAlignment="Top" Width="75" Click="LastRec_Click" />
        <Label Content="ID" Height="28" HorizontalAlignment="Left" Margin="11,147,0,0" Name="label3" VerticalAlignment="Top" />

    </Grid>
</Grid>

どうもありがとう

更新 1

Windows ロード済み

private void Window_Loaded(object sender, RoutedEventArgs e)
    {
          ShowData();
    }


    void ShowData()
    {
        try
        {
            SqlCommand comm = new SqlCommand("Select * from tblTableB", mconn);
            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter(comm);
            da.Fill(dt);
            listView1.DataContext = dt.DefaultView;
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex.Message);
        }
    }

    private void btnShowAll_Click(object sender, RoutedEventArgs e)
    {
        da = new SqlDataAdapter("select * from tblTableB", mconn);
        ds = new DataSet();
        da.Fill(ds, "tblTableB");
        da.Update(ds, "tblTableB");
        this.MaxRow();

        txtID.Text = ds.Tables[0].Rows[rno][0].ToString(); //rno["ID"]
        txtName.Text = ds.Tables[0].Rows[rno][1].ToString(); //rno["Name"] 
        cBHealthDetails.Text = ds.Tables[0].Rows[rno][2].ToString(); //also tried by replacing 
        //rno["HealthDetails"].ToString();
    }

XAML コード

 <TextBox Height="23" HorizontalAlignment="Left" Margin="102,152,0,0" Name="txtID" VerticalAlignment="Top" Width="120" IsReadOnly="True" Background="#26000000"></TextBox>
        <TextBox Height="23" HorizontalAlignment="Left" Margin="102,186,0,0" Name="txtName" VerticalAlignment="Top" Width="243" />
        <ComboBox Height="23" HorizontalAlignment="Left" Margin="102,220,0,0" Name="cBHealthDetails" VerticalAlignment="Top" Width="120">
            <ComboBoxItem Content="Yes"></ComboBoxItem>
            <ComboBoxItem Content="No"></ComboBoxItem>
        </ComboBox>

したがって、wpf コンボックスにバグがあるか、コンボックス プロパティのいずれかで、見逃した何かを行う必要があります。プロパティで行った唯一のことは...アイテム>コレクションで、コンテンツを1つをはいに、もう1つをいいえに追加しました。

私はまだ調査中であり、解決策が見つかったら更新します

解決策が見つかりました

wpf プロセスのようです。または、特にコンボボックスを使用する場合、アーキテクチャ設計が winform とは大きく異なります。次のコードは機能しません

cBHealthDetails.Text = ds.Tables[0].Rows[rno][2].ToString();

また、条件付きループを使用して重複値を排除する必要があります。

したがって、次のコードは、ここで見つけたコンボックスで機能し、sohel khalifa のおかげで...

 for (int intCount = 0; intCount < ds.Tables[0].Rows.Count; intCount++)
               {
                   var val = ds.Tables[0].Rows[intCount]["Health"].ToString();

                   //check if it already exists
                   if (!cbHealth.Items.Contains(val))
                   {
                       cbHealth.Items.Add(val);
                   }
               }

コードを機能させるために xmal ファイルに手を加えることさえしませんでした。つまり、xaml で何もコーディングしていません。ほとんどの開発者やエンド ユーザーは、DataGrid の使用を好むと思います。

4

3 に答える 3

0

このコードを改善できる方法がいくつかあります。まず、ナビゲーション ボタンがクリックされるたびにデータを取得するべきではありません。Text第 2 に、コード内のコントロールを設定する必要はありません。それらはすべて の にバインドされてSelectedItemListViewます。つまり、 を変更するとListViewSelectedItemその値が自動的に更新されます。

データを 1 回ロードする必要があります(イベント ハンドラーDataTableでこれを行うと想定しています)。Loadedナビゲーション関数は次のようになります。

private void PreRec_Click(object sender, RoutedEventArgs e)
{
    if (ds.Tables[0].Rows.Count > 0)
    {
        if (rno > 0)
        {
            rno--;
            listView1.SelectedItem = ds.Tables[0].Rows[rno];
        }
    }
}

そこから、Bindingがすべての作業を行います ( の行をクリックした場合と同様ListView)。

于 2013-07-01T14:13:40.173 に答える
0

解決策で上部を更新しました

于 2013-12-04T22:34:29.803 に答える
0

あなたの主な問題は、あなたのために設定したことItemsSourceです...これはデータではなくクラス全体にバインドされています。データのプロパティを作成し、代わりにそれにバインドすると、データが表示されます。ListView"{Binding}"MainWindow.cs

ちなみに、aListViewはaではありませんComboBox

于 2013-07-24T13:23:01.530 に答える