私は 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="<<" Height="23" HorizontalAlignment="Left" Margin="25,301,0,0" Name="FirstRec" VerticalAlignment="Top" Width="75" Click="FirstRec_Click" />
<Button Content="<" Height="23" HorizontalAlignment="Left" Margin="111,301,0,0" Name="PreRec" VerticalAlignment="Top" Width="75" Click="PreRec_Click" />
<Button Content=">" Height="23" HorizontalAlignment="Right" Margin="0,301,112,0" Name="NxtRec" VerticalAlignment="Top" Width="75" Click="NxtRec_Click" />
<Button Content=">>" 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 の使用を好むと思います。