2017-10-15 1 views
0

MySql 테이블로 이미 채워진 listBox가 있습니다. 나는 어쨌든 사용자가 버튼을 누르면 listBox의 내용을 변경하고 싶습니다.이 작업은 테이블에서 데이터를 필터링하는 새 쿼리를 사용하여 코드에서 SQL 클래스 작성자를 호출하는 것입니다. 문제는 단추 이벤트의 목록 상자 내용을 변경하는 방법입니다. 매니저?클릭하여 MySQL의 listBox 내용을 변경하십시오.

<ListBox x:Name="listBox" BorderBrush="Transparent" Background="Transparent" SelectionChanged="listBox_SelectionChanged" SelectionMode="Single" ItemsSource="{Binding Source={StaticResource NamesTable}}" it HorizontalContentAlignment="Center" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Disabled" RenderTransformOrigin="0.5,0.5" Margin="0" Padding="0,0,0,317" > 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Horizontal" /> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal" Height="200" Width="200" > 
       <Image Margin="3" Source="{Binding pic_path}" RenderOptions.BitmapScalingMode="HighQuality" RenderOptions.EdgeMode="Aliased"/> 
       <TextBox Margin="3" Text="{Binding name}" Visibility="Visible"/> 

      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

및 databbase 테이블 클래스 :

 public DataTable GetTable(String query, String sortBy) 
    { 
     String connString = "server=192.168.*.**;uid=*****;pwd=****;database=viewermenu"; 
     connection = new MySqlConnection(connString); 
     adapter = new MySqlDataAdapter(query, connection); 
     DataTable dataTable = new DataTable(); 
     adapter.Fill(dataTable); 
     dataTable.DefaultView.Sort = sortBy; 
     return dataTable;  
    } 
} 

답변

0

주어진 코드의 일부 실수를 수정하고 시도를 여기 내 코드

private void shirtSelect_Click(object sender, RoutedEventArgs e) 
{ 

    string shirt = "SELECT * FROM viewermenu.grament where type = 'shirt'"; 
    var shirtTable = new DatabaseTable(); 
    string id = null; 
    shirtTable.GetTable(shirt, id); 

    listBox.DataContext = shirtTable; 

} 

및 XAML 측면이다.

1.Add IsItemsHostItemsPanelTemplate받는 사람 :

<ListBox.ItemsPanel> 
    <ItemsPanelTemplate> 
     <StackPanel Orientation="Horizontal" IsItemsHost="True"/> 
    </ItemsPanelTemplate> 
</ListBox.ItemsPanel> 

2.Define ShirtData 클래스 :

public class ShirtData 
{ 
    public string pic_path { get; set; } 

    public string name { get; set; } 

    public ShirtData(string path, string theName) 
    { 
     pic_path = path; 
     name = theName; 
    } 
} 

3.Set 코드 숨김 (일부 의사)의 ItemsSource :

....... 

var table = shirtTable.GetTable(shirt, id); 
var shirts = new List<ShirtData>(); 

foreach (DataRow row in table.Rows) 
{ 
    var shirtData = new ShirtData(row["pic_path"].ToString(), row["name"].ToString()); 
    shirts.Add(shirtData); 
} 

listBox.ItemsSource = shirts; 
+0

TNX @Iron, 나는 그것을했지만이 오류를했다 : 심각도 \t 코드 \t 설명 \t 프로젝트 \t 파일 \t 라인 \t 억제 상태 오류 \t CS0266 암시 System.Collections.IEnumerable '에 유형'Viewer.DatabaseTable을 '변환 할 수 없습니다 \t '. 명시 적 변환이 존재합니다 (캐스트가 누락 되었습니까?) – samane

+0

DatabaseTable 클래스를 표시 할 수 있습니까, IEnumerable 일 수 있습니다. – Iron

+0

아래 첨부 된 질문에 따라 답변을 개선했습니다. 그것은 작동하지만, @KyloRen이 말했듯이, 더 좋은 방법은 'ObservableCollection'이어야하며, 한 번만 정의하고 바인딩하십시오. – Iron

0

그쪽에서 재산을 수정해야합니다. t는 아래의 NamesTable에 바인딩됩니다.

ItemsSource="{Binding Source={StaticResource NamesTable}}" 

즉, 속성을 가정하는 것은 추가하고 일반적으로 목록을 할 것 같은 항목을 제거하는 list입니다.

+0

tnx @KyloRen, NamesTable은 DatabaseTable입니다. 목록으로 변환 하시겠습니까? – samane

+0

@samane, 당신은'ItemsSource'로리스트에 바인딩해야합니다. 목록 속성을 만드십시오. 즉,'List yourList = new List ();'과 바인딩하십시오. 이상적으로 MVVM을 사용하고 ObservableCollection에 바인딩해야합니다. – KyloRen

관련 문제