2012-06-14 18 views
6

Tôi đang cố gắng tạo một chương trình xóa các cột trong một Tập dữ liệu được điền bởi một tệp excel. Cách nó xóa cột là nó so sánh tiêu đề trong mỗi cột với phần tử đầu tiên trong mỗi hàng và xóa cột của bất kỳ chuỗi nào không xuất hiện trong các hàng. Vấn đề của tôi là tôi nhận được một lỗi lạ mà tôi không thể hiểu được. nó nói:Lệnh gọi hàm tạo trên kiểu khớp với ràng buộc ràng buộc đã chỉ định đã ném ra một ngoại lệ

Gọi hàm tạo trên loại 'Excel_Retriever.MainWindow' khớp với ràng buộc ràng buộc đã chỉ định đã ném ngoại lệ '. Dòng số '3' và vị trí dòng '9'.

Tôi mới sử dụng C# và XAML và thực sự đánh giá cao mọi trợ giúp giải quyết lỗi này. Cảm ơn bạn! Đây là mã của tôi:

XAML:

<Window x:Class="Excel_Retriever.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid Name="ExcelGrid"> 
     <DataGrid ItemsSource="{Binding}" AutoGenerateColumns="True" Height="289"  HorizontalAlignment="Left" Margin="10,10,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="481" /> 
    </Grid> 
</Window> 

C#:

namespace Excel_Retriever 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      DataSet excel = GetDataTableFromExcel("C:\\Users\\Sweet Lou\\Desktop\\Adjusted research info.xlsx", "Research"); 
      //dataGrid1.DataContext = excel.Tables[0]; 
      DataSet ignoreds = Ignore_Names(excel); 
      dataGrid1.DataContext = ignoreds.Tables[0]; 
     } 

     public DataSet GetDataTableFromExcel(string FilePath, string strTableName) 
     { 
      try 
      { 
       OleDbConnection con = new OleDbConnection("Provider= Microsoft.ACE.OLEDB.12.0;Data Source=" + FilePath + "; Extended Properties=\"Excel 12.0;HDR=YES;\""); 
       OleDbDataAdapter da = new OleDbDataAdapter("select * from [Sheet1$]", con); 
       DataSet ds = new DataSet(); 
       da.Fill(ds); 
       return ds; 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
      return null; 
     } 

     public DataSet Ignore_Names(DataSet sheet) 
     { 
      DataSet ignoreds = sheet; 
      DataColumn columnNames = sheet.Tables[0].Columns["Name"]; //first column with names 
      //ignoreds.Tables[0].Columns.Add(columnNames); 
      int j = 1; 
      for (int i = 0; i < 15; i++) //change 15 to variable 
      { 
       while (String.Compare(columnNames.Table.Rows[i].ToString(), sheet.Tables[0].Columns[j].ColumnName, true) != 0) 
       { 
        ignoreds.Tables[0].Columns.RemoveAt(j); 
        j++; 
       } 
       j++; 
      } 
      return ignoreds; 
     } 
    } 
} 
+1

Luôn ngắt kết nối và bộ điều hợp với khối sử dụng. – abatishchev

Trả lời

3

Bạn không cần phải vượt qua strTableName phương pháp của bạn khi bạn không bao giờ sử dụng nó.

Nếu bạn sử dụng @ "" cho chuỗi bạn không cần phải thoát khỏi mọi thứ: @ "c: \ users ....";

Bạn nhận được ngoại lệ vì bạn đang cố gắng nuke các hàng không thực sự tồn tại. Đây là phương pháp của bạn, nếu tôi hiểu mục tiêu của bạn ở đây chính xác.

public static void Ignore_Names(DataSet sheet) { 
     var table = sheet.Tables[0]; 
     var columns = table.Columns; 
     var nameColumn = columns["Name"]; 

     var names = new List<string>(); 
     foreach (DataRow row in nameColumn.Table.Rows) 
      names.Add(row[0].ToString().ToLower()); 

     // Work from right to left. If you delete column 3, is column 4 now 3, or still 4? This fixes that issue. 
     for (int i = columns.Count - 1; i >= 0; i--) 
      if (!names.Contains(columns[i].ColumnName.ToLower())) 
       columns.RemoveAt(i); 
    } 

Ngoài ra, trong MainWindow constructor, bạn nên chỉ làm được điều này sau khi bạn đặt excel:

Ignore_Names(excel);  
    dataGrid1.ItemsSource = excel.Tables[0].DefaultView; 

Lưu ý rằng tôi đang thiết ItemsSource, không DataContext, và tôi đi qua các DefaultView. Bạn có thể loại bỏ ràng buộc ItemsSource của bạn khỏi XAML hoàn toàn.

Bạn thực sự nên sử dụng VSTO thay vì DataSets, nhưng đó là một điều khác cần tìm hiểu :)

+0

Cảm ơn bạn rất nhiều! Điều này làm việc hoàn hảo! Một điều cuối cùng mặc dù. Bạn có thể giải thích mục đích sử dụng biểu tượng "@" không? Tôi không hoàn toàn hiểu khi bạn nói tôi không cần phải "thoát khỏi mọi thứ." Cảm ơn một lần nữa! –

+2

Tôi chắc chắn bạn đã tìm ra điều này từ lâu nhưng sử dụng @ "" thay vì "" chỉ làm cho trình biên dịch bỏ qua \ ký tự và xử lý chúng như một ký tự \ thực tế thay vì ký tự thoát. – Gargoyle

Các vấn đề liên quan